Repository navigation
feat(integrations): give the agent each integration's full toolset - #410
Merged
Merged
Conversation
The curated verbs capped what the agent could do: with a `linear` server connected, all 68 of Linear's MCP tools were hidden and the agent had only create + comment — no editing an issue, no status, no projects, milestones or labels. Twenty had no delete; Chatwoot no label removal or anything beyond its five ops. - Linear, Notion, Sentry, Twenty: the full `mcp__<server>__*` toolset is now offered by default, with the server's own input schemas (so no tsforge key-guessing either). The curated verbs stay as shortcuts. TSFORGE_<NAME>_RAW=0 opts back into shortcuts-only. - Policy: a raw integration call is classified by what it does — get_/list_/ search… are integration_read (allowed while planning), anything else integration_write (consent-gated like the verbs); an unknown verb is a write. Twenty's execute_tool follows its inner tool (find_many_* reads, delete_one_* writes). The unregistered-server block now covers these kinds. - Chatwoot: chatwoot_api reaches any endpoint on the configured instance (contacts, conversations, canned responses, teams, deletes…), GET a read and every other method a write; the path cannot leave the instance. New chatwoot_write unlabel. - Guidance and tool descriptions tell the agent it has everything (the old text said "no status op" / "there is no delete", which it repeated to the user); docs updated. Verified live: all 68 Linear tools reach the model with Linear's schemas and reads run in plan mode through real policy + dispatch; chatwoot_api read the account and created + deleted a test contact.
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
tsforge | 2c5f022 | Commit Preview URL Branch Preview URL |
Sep 29 2026, 01:34 PM |
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The curated verbs were a cap, not a convenience. With a
linearserver connected, tsforge hid all 68 of Linear's MCP tools. The agent had onlycreate+comment: it couldn't rename an issue, set status, priority or assignee, or touch projects, milestones or labels. Worse, it told users "the harness only supports create and comment". Twenty had no delete. Chatwoot had no label removal and nothing beyond its five ops.Fix
mcp__<server>__*tool is offered with the server's own input schemas, which also retires tsforge-side key guessing (the class of the earlierteamIdbug). The curated verbs stay as shortcuts (linear_start,twenty_read, …).TSFORGE_<NAME>_RAW=0opts back into shortcuts-only.get_/list_/search…tools areintegration_read, allowed in plan mode.integration_write, gated by consent like the verbs.execute_toolfollows its inner tool:find_many_*reads,delete_one_*writes.chatwoot_api: any endpoint on the configured instance (contacts, starting conversations, canned responses, teams, custom attributes, deletes, reports).GETis a read and every other method a write. The path can't leave the instance (no scheme or host, no..). Plus a newchatwoot_write unlabelop.What Linear's own MCP lacks, and the docs say so: there's no issue delete (cancel it or mark it a duplicate instead), and initiatives only appear if the Linear plan includes them.
Verification
save_issue,save_project,save_milestone,save_issue_label, …).list_projects,list_issue_labelsandlist_teamsran in plan mode through real policy and dispatch.chatwoot_apiread canned responses, teams, custom attributes and contacts. It then created a test contact, deleted it, and confirmed the 404.execute_toolinner routing, the read-name boundary (getawayisn't a read),chatwoot_apipath safety andunlabel.bun run ci:local: 6343 pass, 0 fail, and all PTY suites pass. Docs build is clean.