Skip to content

feat(publish): ship capabilities to chatbot hosts (Claude .mcpb first) - #36

Merged
thorwhalen merged 1 commit into
mainfrom
claude/publish-axis
Jun 17, 2026
Merged

feat(publish): ship capabilities to chatbot hosts (Claude .mcpb first)#36
thorwhalen merged 1 commit into
mainfrom
claude/publish-axis

Conversation

@thorwhalen

Copy link
Copy Markdown
Owner

Summary

Adds the PUBLISH axis (DECISIONS D17) beside COMPLETE/REALIZE: package a
capability (module:function refs, live callables, or a skill's coact: mcp:
block) as a deployable chatbot integration. First target: claude-local-mcpb
a Claude Desktop .mcpb Desktop Extension (a local stdio MCP server, built by
py2mcp).

What's included

  • coact/integration.py — target-neutral IntegrationSpec + integration_spec_from
  • coact/publish.py — open-closed publish-target Registry + publish() + PublishResult
  • coact/publish_mcpb.py — the claude-local-mcpb target (pure-stdlib build path)
  • util.safe_filename — generalized CWE-22 path guard (agent_filename delegates)
  • CLI coact publish; coact[mcpb] extra; skill .claude/skills/coact-publish
  • docs: misc/docs/CHATBOT_INTEGRATION_LANDSCAPE.md (research) + DECISIONS D17

Design

Claude is one target on an open-closed registry — remote connectors, Claude
Code plugins, ChatGPT Apps, and Gemini are planned targets added without editing
the orchestrator. coact owns the spec + packaging; MCP-server construction is
delegated to py2mcp (mirrors the existing mcp realize backend). The runtime
stdio runner ships in py2mcp (claude/stdio-serve).

Tests

367 passed, 4 skipped; 12 doctests; ruff clean. Hardened per an adversarial
review pass: bound-method & unrecognized-source rejection, duplicate-tool-name
warnings, clean error on a missing bundled config.

Add the PUBLISH axis (D17) beside COMPLETE/REALIZE: package a capability
(module:function refs, live callables, or a skill's coact:mcp block) as a
deployable chatbot integration.

- integration.py: target-neutral IntegrationSpec + integration_spec_from ingress
- publish.py: open-closed publish-target Registry + dispatcher + PublishResult
- publish_mcpb.py: claude-local-mcpb target builds a Claude Desktop .mcpb Desktop
  Extension (a local stdio MCP server, built by py2mcp); pure-stdlib build path
- util.safe_filename: generalized CWE-22 path guard (agent_filename delegates)
- CLI: coact publish; coact[mcpb] extra; skill .claude/skills/coact-publish
- docs: misc/docs/CHATBOT_INTEGRATION_LANDSCAPE.md (research) + DECISIONS D17

Claude is one target on an open-closed registry; remote connectors, Claude Code
plugins, ChatGPT Apps, and Gemini are planned targets. Hardened per adversarial
review (bound-method/unrecognized-source rejection, duplicate-tool warning).
Tests + doctests green; ruff clean.
@thorwhalen
thorwhalen merged commit 5d54c1f into main Jun 17, 2026
12 checks passed
@thorwhalen
thorwhalen deleted the claude/publish-axis branch June 17, 2026 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant