feat(mcp): unindexed sessions go quiet — empty tools/list + inactive instructions, no-error policy (#769) (#817)
An MCP session in a workspace with no .codegraph/ previously got the full "lean on codegraph for everything" playbook plus all 8 tools, then every call returned isError — and one or two early errors teach an agent to abandon codegraph for the whole session (maintainer-observed). Now the initialize response picks an instructions variant by index state (cheap sync walk-up, #172 respond-fast contract holds) and tools/list serves an EMPTY list when unindexed: absence is the one signal an agent can't misread. Indexing is deliberately the user's call — the inactive note tells the agent not to run init itself. No-error policy in the tool handler: expected/recoverable conditions (NotIndexedError — cross-project query to an unindexed path, default- project detection miss) return SUCCESS-shaped guidance instead of isError; security refusals (PathRefusalError) stay hard errors without retry encouragement; genuine internal failures keep isError but add a retry-once note so a transient blip doesn't convert to permanent abandonment. Principle recorded in CLAUDE.md. Also: codegraph_search kind:"type" (advertised by its own schema enum) silently matched nothing — now maps to type_alias; codegraph_explore's query param no longer tells agents to run codegraph_search first (contradicted explore's call-FIRST design); server-instructions §Limitations rewords the unindexed case to stay-out-for-the-session. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
0682681175
commit
f9fcc2cd6a
@@ -71,8 +71,29 @@ typically one to a few calls; a grep/read exploration is dozens.
|
||||
|
||||
## Limitations
|
||||
|
||||
- If a tool reports the project isn't initialized, \`.codegraph/\` doesn't exist yet — offer to run \`codegraph init -i\` to build the index.
|
||||
- If a tool reports a project isn't indexed (no \`.codegraph/\`), stop calling codegraph tools for that project for the rest of the session and use your built-in tools there instead. Indexing is the user's decision — mention they can run \`codegraph init\` if it comes up, but don't run it yourself.
|
||||
- Index lags file writes by ~1 second.
|
||||
- Cross-file resolution is best-effort name matching; ambiguous calls may return multiple candidates.
|
||||
- No live correctness validation — that's still the TypeScript compiler / test suite / linter's job. Codegraph supplements those with structural context they don't have.
|
||||
`;
|
||||
|
||||
/**
|
||||
* Instructions variant sent when the workspace has NO codegraph index.
|
||||
*
|
||||
* Sending the full playbook ("lean on codegraph for everything") into a
|
||||
* session where every call would fail wastes the agent's calls and — worse —
|
||||
* the failures teach it codegraph is broken. The unindexed variant is a
|
||||
* short, unambiguous "inactive this session" note; `tools/list` is gated to
|
||||
* empty in the same state, so the agent has nothing to mis-call. Indexing is
|
||||
* deliberately left to the user: the agent is told NOT to run init itself.
|
||||
*/
|
||||
export const SERVER_INSTRUCTIONS_UNINDEXED = `# Codegraph — inactive (workspace not indexed)
|
||||
|
||||
This workspace has no codegraph index (no \`.codegraph/\` directory), so no
|
||||
codegraph tools are available this session. Work with your built-in tools as
|
||||
usual.
|
||||
|
||||
Indexing is the user's decision — do not run it yourself. If the user asks
|
||||
about codegraph, they can enable it by running \`codegraph init\` in the
|
||||
project root and starting a new session.
|
||||
`;
|
||||
|
||||
Reference in New Issue
Block a user