Replaces #205 (qodo-skills), #207 (desktop-commander), #208 (servicenow-sdk),
and #215 (twilio-developer-kit). Those PRs are sitting on unsigned commits
from before signing was enforced; refiling with signed commits on a fresh
branch (no prior pushers) avoids the require_last_push_approval + signed-
commit deadlock.
SHAs bumped to current upstream HEAD for desktop-commander (8c03d339 ->
9c44119a), qodo-skills (8fb6b550 -> b1eb0389), and twilio-developer-kit
(0713fb1f -> 7d15b215). servicenow-sdk SHA unchanged (upstream hasn't
moved since 2026-04-28).
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Tobin South <tobin@anthropic.com>
* ci: migrate scan-plugins.yml to Workload Identity Federation auth
Replaces the static ANTHROPIC_API_KEY repo secret with Workload
Identity Federation: the scan-plugins shared action mints a GitHub
OIDC token (id-token: write) and the claude CLI exchanges it for a
short-lived bearer. The federation rule is bound to this repository
(repository_id-pinned).
Depends on anthropics/claude-plugins-community#34 (adds the WIF
inputs to the shared action). Pinned to that PR's head SHA; will
re-pin to a main-branch SHA once #34 merges.
Drops the 'Require ANTHROPIC_API_KEY' fail-closed guard — the WIF
inputs are literal in this file, so the action's skip-if-no-auth
path can't trigger. Updates the prompt-injection security comment
to reflect the short-lived bearer model.
* scan-plugins: re-pin to cpc#34 merge commit on main
claude-plugins-community#34 merged at e85f0d65b4fc87f07862e1dcdc467950514414ec — re-pinning from
the PR head SHA to the squash-merge commit on main so the pin survives
any future branch GC.
The cockroachdb plugin has a cached failing policy verdict (its
hooks/hooks.json PostToolUse hook fires on every Write|Edit|MultiEdit
with no project-relevance gate). Adding displayName put its entry in
the scan's changed set, so the cached failure blocked this PR.
Leaving the cockroachdb entry byte-identical to main keeps it out of
the changed set so the gate passes. cockroachdb still needs its hook
fixed upstream before it can carry a displayName.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Render human-readable plugin names in the plugin directory instead of the
slug-humanize fallback ("Brand voice", "Cockroachdb", "Sp global").
Adds displayName to each of the 49 entries in marketplace.json.
Partner plugins can still override via their own plugin.json — the consumer
prefers a plugin's manifest displayName and falls back to the marketplace
entry value.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Check MCP URLs workflow (after the connection-failure probe fix in
this PR's parent) surfaced four endpoints that fail every connection:
- mcp.deepsense.ai does not resolve in DNS at all. The biorxiv, chembl,
and clinical_trials servers were rehosted under
hcls.mcp.claude.com (Anthropic MCP directory entries dated
2026-01-07). Paths are unchanged; only the host moved. All three
return a complete MCP initialize response with no auth.
- mcp.paypal.com/mcp returns 404 at every path. PayPal's live endpoint
is /sse (SSE transport, not streamable HTTP) and returns 401 with
WWW-Authenticate: Bearer realm="OAuth" — alive, OAuth required.
Their docs claim /http for streamable transport but it returns 404
today. Type changed http -> sse to match the actual transport.
Anyone with the bio-research or small-business bundle installed gets
connect failures on every agent spawn until this lands.
`mcp.deepsense.ai` is NXDOMAIN — the entire subdomain has been
torn down (parent deepsense.ai still resolves; only the MCP service
is gone). The three connectors served from it (biorxiv, c-trials,
chembl) all fail the "Check MCP URLs" liveness workflow added in
#236 and block every open PR that touches marketplace.json.
Mirrors the `servicenow` removal from #238 — the only truly-dead
case in that cleanup; the rest were repointed. There is no
discoverable migration target for the deepsense MCP service.
Skills are not affected: `bio-research/CONNECTORS.md` documents
the plugin as tool-agnostic via `~~literature` / `~~chemical
database` / `~~clinical trials` placeholders. Users connect any
working MCP server in the relevant category (CONNECTORS.md already
lists alternatives: Google Scholar, Semantic Scholar, EU Clinical
Trials Register, PubChem, DrugBank).
CONNECTORS.md still references the removed server names under
"Included servers"; the plugin owner can update that copy as a
follow-up if they want to keep it strictly accurate.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PayPal migrated their MCP endpoint from Streamable HTTP at `/mcp` to
SSE at `/sse`. Old URL now returns 404 ("gone"); new URL returns
401 (alive, needs auth) and advertises full OAuth discovery including
DCR at /.well-known/oauth-authorization-server.
Matches the repoint pattern from #238 (datadog, apollo, outreach
moved paths; only servicenow was truly dead) and the type:http +
/sse convention already used by `square` in this same file.
Unblocks the "Check MCP URLs" liveness workflow (#236) which has
been failing every open PR on the paypal 404.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
figma and adobe-for-creativity had no source.sha at all -- they fetched
whatever upstream HEAD happened to be at install time. Add a pin to
their current default-branch HEAD. The remaining 13 entries had pins
that lagged upstream; update them to current HEAD.
* Add SHA bump pipeline, policy scan, and MCP URL liveness check
Brings this marketplace's CI in line with claude-plugins-official:
- bump-plugin-shas.yml: nightly sweep that bumps every external entry's
pinned SHA to upstream HEAD, validates each at the new SHA, opens one
signed PR (createCommitOnBranch satisfies required_signatures), and
dispatches the policy scan on the bump branch.
- scan-plugins.yml: Claude policy review of changed external entries.
Caches verdicts in Actions cache keyed (plugin, sha, policy hash) so
the nightly force-reset doesn't re-burn scan time on already-reviewed
SHAs. Cached pass/fail verdicts are served from disk; only uncached
SHAs are scanned. Fails closed when ANTHROPIC_API_KEY is unset.
Designed to be a required status check on main.
- revert-failed-bumps.yml: drops policy-failing entries from a bump PR
via a follow-up signed commit and re-dispatches the scan, so one bad
upstream can't block the rest. Bounded at 3 passes/night, restricted
to SHA-only diffs and first-party-repo PRs.
- check-mcp-urls.yml: probes every http/sse MCP server URL declared by
vendored plugins. Fails on 404/410/unreachable; passes on auth/method
errors (expected without credentials). Deduplicates shared servers so
cost is bounded by unique URLs, not (plugins x servers). Skips empty
and templated URLs.
- .github/policy/: the policy prompt and structured-output schema the
scan reviews against.
Two operator steps after merge:
1. Set the ANTHROPIC_API_KEY repo secret (the scan refuses to silently
skip a required policy review without it).
2. Add a required_status_checks ruleset on main requiring the `scan`
check from GitHub Actions. Adding it before this merges would block
every PR.
* Fix MCP URL probe: connection failure was reported as PASS
curl writes "000" to -w '%{http_code}' on a connection failure AND exits
nonzero. The previous fallback put the echo inside the command
substitution — both wrote, the captured value was "000000", and the
case statement's 000) arm didn't match, so dead hosts fell through to
PASS. Move the fallback assignment outside the substitution so the
captured value is exactly "000" and connection failures fail.
- sales: apollo api.apollo.io/mcp -> mcp.apollo.io/mcp
- sales: outreach mcp.outreach.io/mcp -> api.outreach.io/mcp/
- engineering: datadog mcp.datadoghq.com/mcp -> mcp.datadoghq.com/api/unstable/mcp-server/mcp
- operations: remove servicenow (mcp.servicenow.com does not resolve;
ServiceNow's MCP server is per-instance, no shared hosted URL exists)
All replacement URLs verified live (401/405 on bare GET, i.e. endpoint
exists and is auth-gated / POST-only). All replaced URLs verified dead
(404 or DNS NXDOMAIN). gcal/gmail intentionally untouched; see PR body.
- Add 'Tone for connectors' section to SKILL.md: describe what Claude can
do once connected, not what the platform sells
- Rework step 2 to name functions first, check what the owner uses, then
branch on supported vs unsupported tools
- Add Branch B (unsupported tool) example to happy-path.md
- Add 'pitching the platform instead of the capability' gotcha
Pre-built small business workflows: payroll planning, month-end close,
weekly briefs, growth campaigns, contract review, CRM hygiene, and more.
31 skills (15 atomic + 15 workflow commands + 1 router/onboarding) built
around QuickBooks, PayPal, HubSpot, Canva, DocuSign, Gmail/Outlook, and
other small-business tools.
- Add small-business/ with skills, plugin.json, and README
- Register plugin in .claude-plugin/marketplace.json
Add the Consensus academic literature search connector
(https://mcp.consensus.app/mcp) under the literature category.
Update CONNECTORS.md and README.md tables, and bump the plugin
version to 1.2.0.
Adobe's Creative Cloud skills for image editing, design automation,
background removal, vectorization, and retouching. Points at the
plugins/creative-cloud/adobe-for-creativity subdir of adobe/skills,
SHA-pinned to current main.
Convert 10 description-field em-dash escapes (\u2014) back to literal
UTF-8 (—) to match the file's encoding policy enforced by the pre-commit
hook. No functional change.
Affected entries: apollo, engineering, human-resources, design,
operations, cockroachdb, nimble, searchfit-seo, product-tracking-skills,
pdf-viewer.
api.github.com/mcp returns 404 — the route does not exist.
Correct endpoint is api.githubcopilot.com/mcp/ (verified from
claude-plugins-official/external_plugins/github/.mcp.json).
Fixes#168
Slack's auth server does not support dynamic client registration, so a
bare {type, url} config fails in Claude Code with "Incompatible auth
server: does not support DCR" before the OAuth prompt appears.
Cowork/Desktop resolve these via the claude.ai connector directory and
don't hit this, but Claude Code does raw OAuth against the URL. The
broken entry also shadows the working claude.ai Slack passthrough
(manual > plugin > claude.ai dedup), so users lose Slack entirely.
Adds the same oauth.{clientId, callbackPort} block already present in
partner-built/slack/.mcp.json to all 12 role plugins.
Refs: anthropics/claude-code#38229
Across all plugin .mcp.json files:
- Rename "google-calendar" key to "google calendar"
- Replace gmail and google calendar URLs with empty string placeholders
The bio-research entry was removed in 2d6f7e2 (PR #115) without a stated
reason, but the plugin directory was migrated and continues to be
maintained. This restores the original entry pending confirmation that
the removal was intentional.
Upstream added 28 plugins since February (partners, URL-source).
Keep all upstream entries, append pdf-viewer.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Without -y, npx prompts 'Ok to proceed? (y)' on first install of a
package, which hangs the stdio MCP connection (no TTY to answer).
Keeping version unpinned (auto-latest) — currently pulls 1.3.1 which
has the interact/annotation capabilities. Tested end-to-end via
'claude --plugin-dir pdf-viewer/'.
Plugin name: pdf → pdf-viewer
- 'Viewer' makes the interactive/visual modality self-evident
- Naturally explains why NOT to use for summarization
- Matches enterprise-search precedent (capability-named, not job-function)
Skill name: pdf → view-pdf
- Verb-noun matches repo convention (review-contract, triage-nda)
Trigger description (SKILL.md frontmatter):
- Hybrid style: situation framing + verb list for keyword matching
- Includes 'open, show, view' so bare 'open this PDF' triggers the
skill — SKILL body then disambiguates viewer vs Read
- Keeps 'Not for summarization (use Read)' guard
Marketplace/plugin.json description:
- Marketing-oriented (benefits-first) to match other plugins' style
- 'View, annotate, sign... Mark up contracts, fill forms with visual
feedback, stamp approvals, place signatures — download annotated copy'
Updated all /pdf:* cross-references → /pdf-viewer:*
Accuracy:
- list_pdfs: 'remote origins' → 'local directories' (server has no
remote allowlist, any HTTPS works)
- get_screenshot: 'PNG' → 'image' (server returns JPEG)
- Supported sources: clarify only arXiv auto-converts /abs/→PDF;
others need direct PDF URLs
Conventions (matching legal/, productivity/ patterns):
- Add argument-hint frontmatter to all 4 commands
- Add CONNECTORS.md callout to all commands
Positioning — form filling:
- Emphasize this is VISUAL form filling (vs programmatic tools)
- Document the unnamed-field workflow: screenshot → match bounding
boxes to visual labels → fill by name. Many real PDFs have fields
named 'Text1', 'Field_7' with labels only on the rendered page.
- User gets live feedback and can edit directly in viewer
The underlying @modelcontextprotocol/server-pdf gained an `interact`
tool with 10 annotation types (highlight, underline, strikethrough,
note, rectangle, circle, line, freetext, stamp, image), form filling,
auto-highlight-text, page extraction, and annotated-PDF download.
This reshapes the plugin around interactive workflows:
- Rename plugin: pdf-research → pdf
- Rename skill: pdf-reading → pdf (unified, covers all capabilities)
- Commands: drop /summarize, rename /read → /open, add /annotate,
/fill-form, /sign
- SKILL.md: document interact tool, all annotation types, coordinate
system, interactive workflows (AI-driven annotate, form filling,
visual signing)
- Positioning: explicitly steer AWAY from viewer for pure ingestion
(use native Read instead) — the viewer's value is user interactivity
- /sign disclaimer: visual signature image, not certified digital sig
Out of scope (documented): summarization, cert signing, PDF generation.