Repository navigation
fix(mcp): decode and show each tool's title in tools-list - #20
Merged
Merged
Conversation
ToolDefinition had no top-level Title field, so every tool decoded as untitled. tools/list showed 0/63 titled against a google-ads-mcp that returns 63/63 -- and because --json and the on-disk tools cache both re-marshal this struct, the field vanished from those too. That is worse than cosmetic: a title is a BLOCKING Claude Connectors Directory submission requirement, and the pipeboard.co docs point at this command as the live compliance check. Following that advice reported the whole fleet as non-compliant when it was fine. MCP puts the display name in two places: the top-level title (spec 2025-06-18, what Pipeboard servers populate) and the legacy annotations.title. Only the latter was modeled. Add the top-level field, prefer it via DisplayTitle() with the legacy one as fallback, and surface it in all three output modes -- a title column in the compact list, a Title: line under --verbose, and the raw field under --json. An untitled tool renders "(no title!)" rather than blank, since on a Pipeboard server that is a real defect worth seeing.
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.
The bug
ToolDefinitionmodeled only the legacyannotations.title, not the top-leveltitlethat MCP spec 2025-06-18 defines and that every Pipeboard server populates. So the field was dropped at decode time andtools-listreported 0 of 63 Google Ads tools titled against a server returning 63 of 63.Because
--jsonand the on-disk tools cache both re-marshal this struct, the field disappeared from those too.Why it's not cosmetic
A
titleon every tool is a blocking Claude Connectors Directory submission requirement — one untitled tool auto-rejects the whole server.docs/CLAUDE_CONNECTORS_SUBMISSION_TITLE_REQUIREMENT.mdand §11 of themcp-server-requirementsskill both point atpipeboard mcp tools-listas the live compliance check. Following that advice reported the entire fleet as non-compliant when it was fine — a false negative on the one check that gates a submission.Found while verifying pipeboard.co#2326 in production.
The fix
TitletoToolDefinition;DisplayTitle()prefers it and falls back toannotations.title.Title:line under--verbose, the raw field under--json.(no title!)rather than blank — on a Pipeboard server that's a real defect and should be visible.Before / after
Verification
make test/make lint/make buildall pass, plus the locally built binary against live production:--jsonresultSpot-checks:
update_ad_url_tags→ "Update Ad URL Tags",get_adsets→ "Get Ad Sets",get_tiktok_adgroups→ "Get TikTok Ad Groups",create_google_ads_pmax_campaign→ "Create Google Ads PMax Campaign".--verboseconfirmed showing theTitle:line.New tests cover the top-level round-trip (including re-marshal, which is what
--jsonand the cache depend on), theDisplayTitle()precedence chain, and the missing-title placeholder.