Skip to main content
Glama

add_vcs_link

Links a task to a pull request, commit, or branch so PR-driven status automation and shipped-code reports can match the task to the code that implements it.

Instructions

Link a task to a pull request, commit, or branch. This is what makes the task↔PR join real: a task with no VCS link cannot be matched to the code that implements it, so PR-driven status automation and any 'what shipped for this task?' report simply will not see it. Call it as soon as the PR exists. Only task_id and url are needed — provider, link_type and external_id are inferred from a GitHub or GitLab URL. If the PR is ALREADY merged (or closed) by the time you call this — e.g. you finished, merged, and are linking retroactively — pass status='merged' (or 'closed'). Without it the link starts as 'open' and the done-evidence gate will block move→done on it forever: no GitHub webhook fires for a merge that happened before the link existed.

Input Schema

NameRequiredDescriptionDefault
urlYesLink URL, e.g. https://github.com/owner/repo/pull/123.
titleNoHuman-readable label, e.g. the PR title.
statusNoPR status, if you already know it: open, merged, closed. Pass 'merged' when linking a PR that was merged before this call — that is the one case a webhook can never backfill. Omit it to let the link start as 'open' (the safe default when the PR is still active). Calling add_vcs_link again on the same PR with a status update is safe — it corrects the existing link rather than failing.
task_idYesTask ID.
providerNoVCS provider: github, gitlab. Inferred from the URL host; defaults to github.
link_typeNoWhat the URL points at: pr (alias: pull_request), commit, branch. Inferred from the URL path; defaults to pr.
external_idNoPR number, commit SHA, or branch name. Inferred from the URL; only needed when the URL is not a recognised PR/commit/branch link.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.1

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description goes well beyond: it explains the consequence of omission ('PR-driven status automation... will not see it'), and the critical trap that a missing status on a pre-merged PR will permanently block move_task→done because 'no GitHub webhook fires for a merge that happened before the link existed.' That is exactly the non-obvious behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose in sentence one, then layers rationale and the failure mode. It is on the long side (five dense sentences), but each sentence earns its place by disclosing a distinct failure mode (no join, blocked move→done, no webhook backfill) rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-param mutating tool with no output schema, the description covers when to call, what gets created, the required params, and the one dangerous edge case. It does not describe the return shape (e.g. the created link's id/status), which is the only notable gap given no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so 3 is the baseline, but the description adds real value: it tells the agent 'Only task_id and url are needed — provider, link_type and external_id are inferred from a GitHub or GitLab URL,' which frames cross-parameter inference rather than restating each field. It also reinforces the status='merged' semantics with a why, going beyond the schema's field-level note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Link a task to a pull request, commit, or branch.' The second sentence goes further, framing the tool's role as making 'the task↔PR join real,' which distinguishes it from sibling add_comment/add_dependency by spelling out the exact business object it creates and why it matters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit timing ('Call it as soon as the PR exists') and a conditional branch for the retroactive case ('If the PR is ALREADY merged... pass status=merged'). It also warns what happens if you omit it. No alternative tool is named, but no sibling tool performs this join, so the guidance is effectively complete without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.