JSDoc — 18 Operations for AI Agents

JSDoc annotations carry the type system of untyped JavaScript — params, returns, typedefs that tooling depends on. act101 reads annotations as structure, so agents keep documentation and code in agreement instead of letting them drift.

This page is the canonical reference an AI coding agent uses to refactor, query, and analyze JSDoc code through the act MCP server. 18 operations available: 0 refactor, 18 query, 0 analysis. Each operation is callable from Claude Code, Cursor, Codex, OpenCode, or any MCP-compatible agent host. Click any operation for a stable anchor link suitable for citation.

18Query

Worked JSDoc examples

act101 reads a JSDoc comment's block and inline tags — @param, @returns, @typedef, @property, and the rest — as its declarations: each tag surfaces in the skeleton as a tag, named for the tag itself. Unlike Javadoc, JSDoc's @typedef and @property tags describe an object's shape directly in the comment, and symbols adds the type name a @typedef introduces and the parameter or property identifier each @param/@property tag names as further entries. The unit of structure in this grammar is the tag, not the function or variable the comment documents — act101 never sees the JavaScript declaration a JSDoc block sits above, only the comment's own tag structure. Each example below is the verbatim output of the command shown, run against the file shown. Query outputs are pretty-printed with the timing block omitted.

Read a comment block's tags without the code they document

geofence.jsdoc is three doc comments for a geofencing utility: a distance function with four @param tags and a @returns, a @typedef describing a GeoFence shape with three @property tags, and a containment check with its own @param/@returns.

$ act query skeleton geofence.jsdoc

Before

/**
 * Computes the great-circle distance between two geographic coordinates.
 *
 * @param {number} lat1 latitude of the first point, in degrees
 * @param {number} lon1 longitude of the first point, in degrees
 * @param {number} lat2 latitude of the second point, in degrees
 * @param {number} lon2 longitude of the second point, in degrees
 * @returns {number} the distance in kilometers
 */

/**
 * @typedef {Object} GeoFence
 * @property {number} centerLat center latitude, in degrees
 * @property {number} centerLon center longitude, in degrees
 * @property {number} radiusKm the fence radius, in kilometers
 */

/**
 * Determines whether a coordinate falls inside a geofence.
 *
 * @param {GeoFence} fence the geofence to test against
 * @param {number} lat latitude of the point to test
 * @param {number} lon longitude of the point to test
 * @returns {boolean} true if the point is inside the fence
 */

Output

{
    "type": "Skeleton",
    "declarations": [
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 4,
                    "byte_offset": 84
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 64,
                    "byte_offset": 144
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 4,
                    "byte_offset": 84
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 10,
                    "byte_offset": 90
                }
            }
        },
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 4,
                    "byte_offset": 148
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 65,
                    "byte_offset": 209
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 4,
                    "byte_offset": 148
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 10,
                    "byte_offset": 154
                }
            }
        },
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 4,
                    "byte_offset": 213
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 65,
                    "byte_offset": 274
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 4,
                    "byte_offset": 213
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 10,
                    "byte_offset": 219
                }
            }
        },
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 4,
                    "byte_offset": 278
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 66,
                    "byte_offset": 340
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 4,
                    "byte_offset": 278
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 10,
                    "byte_offset": 284
                }
            }
        },
        {
            "kind": "tag",
            "name": "@returns",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 8,
                    "column": 4,
                    "byte_offset": 344
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 8,
                    "column": 48,
                    "byte_offset": 388
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 8,
                    "column": 4,
                    "byte_offset": 344
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 8,
                    "column": 12,
                    "byte_offset": 352
                }
            }
        },
        {
            "kind": "tag",
            "name": "@typedef",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 4,
                    "byte_offset": 401
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 30,
                    "byte_offset": 427
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 4,
                    "byte_offset": 401
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 12,
                    "byte_offset": 409
                }
            }
        },
        {
            "kind": "tag",
            "name": "@property",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 4,
                    "byte_offset": 431
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 60,
                    "byte_offset": 487
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 4,
                    "byte_offset": 431
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 13,
                    "byte_offset": 440
                }
            }
        },
        {
            "kind": "tag",
            "name": "@property",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 4,
                    "byte_offset": 491
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 61,
                    "byte_offset": 548
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 4,
                    "byte_offset": 491
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 13,
                    "byte_offset": 500
                }
            }
        },
        {
            "kind": "tag",
            "name": "@property",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 4,
                    "byte_offset": 552
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 63,
                    "byte_offset": 611
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 4,
                    "byte_offset": 552
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 13,
                    "byte_offset": 561
                }
            }
        },
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 4,
                    "byte_offset": 687
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 56,
                    "byte_offset": 739
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 4,
                    "byte_offset": 687
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 10,
                    "byte_offset": 693
                }
            }
        },
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 4,
                    "byte_offset": 743
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 53,
                    "byte_offset": 792
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 4,
                    "byte_offset": 743
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 10,
                    "byte_offset": 749
                }
            }
        },
        {
            "kind": "tag",
            "name": "@param",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 4,
                    "byte_offset": 796
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 54,
                    "byte_offset": 846
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 4,
                    "byte_offset": 796
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 10,
                    "byte_offset": 802
                }
            }
        },
        {
            "kind": "tag",
            "name": "@returns",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 24,
                    "column": 4,
                    "byte_offset": 850
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 24,
                    "column": 60,
                    "byte_offset": 906
                }
            },
            "name_range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 24,
                    "column": 4,
                    "byte_offset": 850
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 24,
                    "column": 12,
                    "byte_offset": 858
                }
            }
        }
    ]
}

The skeleton reports thirteen tags: five from the distance function, four from the @typedef block (@typedef plus three @property tags), and four from the containment check.

List tag names alongside the identifiers and types they document

The @typedef tag names a type, GeoFence, while its three @property tags name the fields centerLat, centerLon, and radiusKm that type carries.

$ act query symbols geofence.jsdoc

Before

/**
 * Computes the great-circle distance between two geographic coordinates.
 *
 * @param {number} lat1 latitude of the first point, in degrees
 * @param {number} lon1 longitude of the first point, in degrees
 * @param {number} lat2 latitude of the second point, in degrees
 * @param {number} lon2 longitude of the second point, in degrees
 * @returns {number} the distance in kilometers
 */

/**
 * @typedef {Object} GeoFence
 * @property {number} centerLat center latitude, in degrees
 * @property {number} centerLon center longitude, in degrees
 * @property {number} radiusKm the fence radius, in kilometers
 */

/**
 * Determines whether a coordinate falls inside a geofence.
 *
 * @param {GeoFence} fence the geofence to test against
 * @param {number} lat latitude of the point to test
 * @param {number} lon longitude of the point to test
 * @returns {boolean} true if the point is inside the fence
 */

Output

{
    "type": "Symbols",
    "symbols": [
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 4,
                    "byte_offset": 84
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 10,
                    "byte_offset": 90
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "lat1",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 20,
                    "byte_offset": 100
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 4,
                    "column": 24,
                    "byte_offset": 104
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 4,
                    "byte_offset": 148
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 10,
                    "byte_offset": 154
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "lon1",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 20,
                    "byte_offset": 164
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 5,
                    "column": 24,
                    "byte_offset": 168
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 4,
                    "byte_offset": 213
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 10,
                    "byte_offset": 219
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "lat2",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 20,
                    "byte_offset": 229
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 6,
                    "column": 24,
                    "byte_offset": 233
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 4,
                    "byte_offset": 278
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 10,
                    "byte_offset": 284
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "lon2",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 20,
                    "byte_offset": 294
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 7,
                    "column": 24,
                    "byte_offset": 298
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@returns",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 8,
                    "column": 4,
                    "byte_offset": 344
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 8,
                    "column": 12,
                    "byte_offset": 352
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@typedef",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 4,
                    "byte_offset": 401
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 12,
                    "byte_offset": 409
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "GeoFence",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 22,
                    "byte_offset": 419
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 12,
                    "column": 30,
                    "byte_offset": 427
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@property",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 4,
                    "byte_offset": 431
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 13,
                    "byte_offset": 440
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "centerLat",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 23,
                    "byte_offset": 450
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 13,
                    "column": 32,
                    "byte_offset": 459
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@property",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 4,
                    "byte_offset": 491
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 13,
                    "byte_offset": 500
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "centerLon",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 23,
                    "byte_offset": 510
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 14,
                    "column": 32,
                    "byte_offset": 519
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@property",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 4,
                    "byte_offset": 552
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 13,
                    "byte_offset": 561
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "radiusKm",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 23,
                    "byte_offset": 571
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 15,
                    "column": 31,
                    "byte_offset": 579
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 4,
                    "byte_offset": 687
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 10,
                    "byte_offset": 693
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "fence",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 22,
                    "byte_offset": 705
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 21,
                    "column": 27,
                    "byte_offset": 710
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 4,
                    "byte_offset": 743
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 10,
                    "byte_offset": 749
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "lat",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 20,
                    "byte_offset": 759
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 22,
                    "column": 23,
                    "byte_offset": 762
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@param",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 4,
                    "byte_offset": 796
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 10,
                    "byte_offset": 802
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "lon",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 20,
                    "byte_offset": 812
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 23,
                    "column": 23,
                    "byte_offset": 815
                }
            },
            "visibility": "unknown"
        },
        {
            "name": "@returns",
            "kind": "unknown",
            "range": {
                "start": {
                    "file": "geofence.jsdoc",
                    "line": 24,
                    "column": 4,
                    "byte_offset": 850
                },
                "end": {
                    "file": "geofence.jsdoc",
                    "line": 24,
                    "column": 12,
                    "byte_offset": 858
                }
            },
            "visibility": "unknown"
        }
    ],
    "parse_error": true
}

symbols lists the tags again interleaved with GeoFence and the parameter/property identifiers each tag names — lat1, centerLat, fence — all reported with kind: unknown since none of them map to one of act101's semantic kinds.

Query

18 query tools, the same on every supported language. Descriptions live in the shared reference: /docs/query-tools.

callers control_flow data_flow definition diagnostics effect_closure effect_summary fix_auto get_type graph import_organize interface mutations references repo_outline skeleton symbols symbols_batch

← jqJSON →