{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T04:58:42.044Z","url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp","markdownUrl":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp.md","server":{"slug":"com-commentkeyword-mcp","name":"CommentKeyword","registryName":"com.commentkeyword/mcp","description":"Create and manage Instagram comment-to-DM keyword automations in CommentKeyword.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"commentkeyword-mcp","type":"mcpb","identifier":"https://github.com/commentkeyword/agent-toolkit/releases/download/v0.2.0/commentkeyword-mcp-0.2.0.mcpb","withdrawn":false,"url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp","version":"0.2.0","transport":"stdio","scoredAt":"2026-11-06T02:43:59.318Z"},"score":{"total":33,"tier":"low","status":"scored","weekDelta":0,"history":[{"date":"2026-11-06","total":33},{"date":"2026-11-05","total":33},{"date":"2026-11-04","total":33},{"date":"2026-11-03","total":33},{"date":"2026-11-02","total":33},{"date":"2026-11-01","total":33},{"date":"2026-10-31","total":33},{"date":"2026-10-30","total":33},{"date":"2026-10-29","total":33},{"date":"2026-10-28","total":33},{"date":"2026-10-27","total":38}]},"categories":[{"name":"Supply Chain Security","score":0,"verdict":"unverified","reasons":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"ecosystem_unsupported"}},{"code":"cve.inconclusive","args":{"reason":"no_manifest_bundled"}},{"code":"installscript.inconclusive","args":{"reason":"install_surface_unavailable"}},{"code":"dephealth.inconclusive","args":{"reason":"no_manifest_bundled"}}]},{"name":"Provenance & Transparency","score":19,"verdict":"fail","reasons":["Repository check failed: the declared repository URL redirects; it must resolve directly.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 10 days ago).","Security-disclosure policy not yet verified: we couldn't inspect the source repository."],"codes":[{"code":"provenance.repo_redirected","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"10"}},{"code":"disclosure.repo_inconclusive","args":{"reason":"repo_unreachable"}}]},{"name":"Schema Quality & AI Usability","score":62,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 1446 tokens (~241/item across 6 items; 6 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"241","items":"6","tools":"6","tokens":"1446","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":98,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","93% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"93"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"1","destructive":"1"}},{"code":"toolsafety.manipulation_clean","args":{"units":"7","judged":"7"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Security-disclosure policy not yet verified: we couldn't inspect the source repository.","Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"malware":[],"components":[{"slug":"commentkeyword-mcp","type":"mcpb","identifier":"https://github.com/commentkeyword/agent-toolkit/releases/download/v0.2.0/commentkeyword-mcp-0.2.0.mcpb","withdrawn":false,"score":33,"current":true,"url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp","markdownUrl":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp.md"}],"facts":[{"label":"Registry","value":"mcpb"},{"label":"Package","value":"https://github.com/commentkeyword/agent-toolkit/releases/download/v0.2.0/commentkeyword-mcp-0.2.0.mcpb"},{"label":"Version","value":"0.2.0"},{"label":"Transport","value":"stdio"},{"label":"SHA-256","value":"9473133d43ce3820abf92c499a6a0178cff36c6b27904025ba2f9caa640babd3"}],"install":{"available":true,"bundleSha256":"9473133d43ce3820abf92c499a6a0178cff36c6b27904025ba2f9caa640babd3"},"tools":[{"name":"list_keywords","title":"List keyword automations","description":"List the comment-keyword automations in the workspace, newest first. Use it to check whether a keyword already exists before creating one.","inputs":[{"name":"limit","type":"integer","required":false,"description":"Page size, default 50."},{"name":"offset","type":"integer","required":false,"description":null},{"name":"search","type":"string","required":false,"description":"Case-insensitive search in the keyword text."},{"name":"status","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"get_keyword","title":"Get a keyword automation","description":"Get one keyword automation by its publicId, including whether it is still waiting for the next post (nextPostStatus).","inputs":[{"name":"id","type":"string","required":true,"description":"The keyword publicId."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"create_keyword","title":"Create a keyword automation","description":"Create a comment-to-DM automation: when someone comments the keyword, CommentKeyword sends them the DM (and optionally replies publicly). Confirm the details with the user first, because it messages real people. Fails with 409 if the keyword already exists for the same posts, or with keyword_limit_exceeded when the plan has no free active-keyword slot.","inputs":[{"name":"aiAgentId","type":"string|null","required":false,"description":"Optional publicId of an existing Live AI agent (from list_agents) that takes over the conversation when the person replies to the DM. Its conversation hook is appended to the DM. Only works on paid p…"},{"name":"commentReplies","type":"array","required":false,"description":"Optional public reply variants (up to 10), one picked at random per comment, e.g. \"Sent! Check your DMs {{namefirst}}\". Max 500 characters each."},{"name":"dmMessages","type":"array","required":true,"description":"DM variants (1-10); one is picked at random per commenter, so 2-3 wordings of the same message feel less robotic. Each must deliver the promised link. Max 1,000 characters each. Supports {{handle}},…"},{"name":"isActive","type":"boolean","required":false,"description":"Create it active (default) or paused. Only active keywords count toward the plan limit."},{"name":"keyword","type":"string","required":true,"description":"The word people comment, e.g. \"GUIDE\". Matching is case-insensitive. Prefer one distinctive word."},{"name":"matchMode","type":"string","required":false,"description":"contains (default): the comment only has to include the keyword as a word, e.g. \"GUIDE please!\". exact: the whole comment must be the keyword."},{"name":"matchWithoutAccents","type":"boolean","required":false,"description":"Only for keywords with Latin accents: also match the unaccented spelling (e.g. \"guía\" also matches \"guia\")."},{"name":"mediaIds","type":"array","required":false,"description":"Instagram media IDs. Required for target \"specific_posts\"; with \"next_post\" they are matched too."},{"name":"publicReplyEnabled","type":"boolean","required":false,"description":"Post one of commentReplies publicly. Defaults to true when commentReplies is not empty."},{"name":"target","type":"string","required":true,"description":"Which posts trigger the DM. next_post: the next post or reel published on the connected Instagram account (best for a video that is not live yet). all_posts: every post, current and future. specific_…"},{"name":"trackLinks","type":"boolean","required":false,"description":"Replace links in the DM with tracked links to count clicks."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":515},{"name":"update_keyword","title":"Update a keyword automation","description":"Change a keyword automation. Only the fields you pass change. Passing target re-targets it (e.g. next_post to wait for the next upload again). dmMessages and commentReplies replace all existing variants. Set isActive false to pause it.","inputs":[{"name":"aiAgentId","type":"string|null","required":false,"description":"Optional publicId of an existing Live AI agent (from list_agents) that takes over the conversation when the person replies to the DM. Its conversation hook is appended to the DM. Only works on paid p…"},{"name":"commentReplies","type":"array","required":false,"description":"Optional public reply variants (up to 10), one picked at random per comment, e.g. \"Sent! Check your DMs {{namefirst}}\". Max 500 characters each."},{"name":"dmMessages","type":"array","required":false,"description":"DM variants (1-10); one is picked at random per commenter, so 2-3 wordings of the same message feel less robotic. Each must deliver the promised link. Max 1,000 characters each. Supports {{handle}},…"},{"name":"id","type":"string","required":true,"description":"The keyword publicId."},{"name":"isActive","type":"boolean","required":false,"description":"Create it active (default) or paused. Only active keywords count toward the plan limit."},{"name":"keyword","type":"string","required":false,"description":"The word people comment, e.g. \"GUIDE\". Matching is case-insensitive. Prefer one distinctive word."},{"name":"matchMode","type":"string","required":false,"description":"contains (default): the comment only has to include the keyword as a word, e.g. \"GUIDE please!\". exact: the whole comment must be the keyword."},{"name":"matchWithoutAccents","type":"boolean","required":false,"description":"Only for keywords with Latin accents: also match the unaccented spelling (e.g. \"guía\" also matches \"guia\")."},{"name":"mediaIds","type":"array","required":false,"description":"Instagram media IDs. Required for target \"specific_posts\"; with \"next_post\" they are matched too."},{"name":"publicReplyEnabled","type":"boolean","required":false,"description":"Post one of commentReplies publicly. Defaults to true when commentReplies is not empty."},{"name":"target","type":"string","required":false,"description":"Which posts trigger the DM. next_post: the next post or reel published on the connected Instagram account (best for a video that is not live yet). all_posts: every post, current and future. specific_…"},{"name":"trackLinks","type":"boolean","required":false,"description":"Replace links in the DM with tracked links to count clicks."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":504},{"name":"delete_keyword","title":"Delete a keyword automation","description":"Permanently delete a keyword automation. Prefer update_keyword with isActive false to pause it instead. If the keyword has an AI agent, the first call returns DELETE_CONFIRMATION_REQUIRED with an impact summary; show it to the user and call again with confirm true only if they agree.","inputs":[{"name":"confirm","type":"boolean","required":false,"description":"Set true only after the user has reviewed a DELETE_CONFIRMATION_REQUIRED response."},{"name":"id","type":"string","required":true,"description":"The keyword publicId."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":96},{"name":"list_agents","title":"List AI agents","description":"List the AI agents already set up in the workspace (agents are created and edited in the CommentKeyword dashboard). Pass the publicId of a Live agent as aiAgentId to create_keyword or update_keyword so it keeps chatting after the first DM.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":57}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-06T02:43:59.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":"no_attestation","reasonLabel":"No attestation published","discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-27","recent":[{"id":"chg_01a1aebd-d6ee-7415-86e5-c14914bea3a7","kind":"check.unverifiable","summary":"Security disclosure (fail → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-06","url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp#chg-chg_01a1aebd-d6ee-7415-86e5-c14914bea3a7"},{"id":"chg_01a1800b-b8bb-76eb-89e4-09b6b7d37a60","kind":"check.verdict","summary":"Source repository (pass → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp#chg-chg_01a1800b-b8bb-76eb-89e4-09b6b7d37a60"},{"id":"chg_01a1800b-b8bc-70dd-bbf8-0023381629d3","kind":"score.total_changed","summary":"Trust score (38 → 33)","materiality":"functional","direction":"regression","scoreDelta":-5,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp#chg-chg_01a1800b-b8bc-70dd-bbf8-0023381629d3"},{"id":"chg_01a17cbe-9fd4-7a7e-8d42-78c671d502b1","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-27","url":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp#chg-chg_01a17cbe-9fd4-7a7e-8d42-78c671d502b1"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp","markdown":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp.md","changelogJson":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/com-commentkeyword-mcp/commentkeyword-mcp.xml","external":[{"label":"Website","href":"https://commentkeyword.com/instagram-mcp-server"}]}}