npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@vantageos/vantage-registry-mcp

v1.8.0

Published

MCP server exposing VantageRegistry Convex functions as Claude Code tools

Readme

@vantageos/vantage-registry-mcp

MCP server exposing VantageRegistry Convex functions as Claude Code tools via stdio transport.

Version: 1.8.0 Backend: Convex (vibrant-ibex-858) Transport: stdio (Claude Code MCP protocol)


Installation

Add to your Claude Code MCP config (.claude/mcp.json or equivalent):

{
  "mcpServers": {
    "vantage-registry": {
      "command": "bunx",
      "args": ["@vantageos/[email protected]"],
      "env": {
        "CONVEX_URL": "https://vibrant-ibex-858.convex.cloud",
        "VR_ADMIN_WRITE_SECRET": "<your-write-secret>"
      }
    }
  }
}

Pin @1.8.0 in args so bunx does not serve a cached older version. Or set CONVEX_URL in .env.local at the repo root.


What's new in 1.8.0

| Feature | Details | |---------|---------| | doc-binary template type | upsert_template accepts template_type="doc-binary" plus 4 new optional fields: renderer_kind, input_schema, assets, output_formats | | 4 template_consumers tools | link_template_consumer, unlink_template_consumer, list_consumers_for_template, list_templates_for_consumer — junction table linking templates to the components/BUs that consume them | | 3 Bible fields on components | consumers, clientReadyStage, and lastUsageSignal now returned by list_components / get_component |


Tools

Teams

| Tool | Description | |------|-------------| | upsert_team | Create or update a team (upsert by name) | | list_teams | List all teams — optional status filter | | get_team | Get a team by Convex document ID |

Agents

| Tool | Description | |------|-------------| | upsert_agent | Create or update an agent (upsert by name) | | list_agents | List agents — optional status / team filters | | list_agents_by_team | List agents for a specific team | | get_agent | Get an agent by Convex document ID |

Skills

| Tool | Description | |------|-------------| | upsert_skill | Create or update a skill (upsert by name). New in 1.6.0: optional vrBody writes the full SKILL.md body (vrContent/hash/version) in the same call | | list_skills | List skills — optional status / team / category filters | | list_skills_by_team | List skills for a specific team | | list_skills_by_category | List skills for a specific category | | get_skill | Get a skill by Convex document ID |

Plugins

| Tool | Description | |------|-------------| | upsert_plugin | Create or update a plugin (upsert by name) | | list_plugins | List plugins — optional status filter | | get_plugin | Get a plugin by Convex document ID |

Hooks

| Tool | Description | |------|-------------| | upsert_hook | Create or update a hook (upsert by name). New in 1.6.0: optional tests array of hook test file paths | | list_hooks | List hooks — optional status / event / scope filters | | get_hook | Get a hook by Convex document ID |

Prompts

| Tool | Description | |------|-------------| | upsert_prompt | Create or update a prompt (upsert by name) | | list_prompts | List prompts — optional status / team filters | | get_prompt | Get a prompt by Convex document ID |

Templates

| Tool | Description | |------|-------------| | upsert_template | Create or update a template (upsert by name). New in 1.8.0: template_type="doc-binary" + 4 doc-binary fields | | list_templates | List templates — optional team and template_type filters | | get_template | Get a template by Convex document ID | | detect_template_drift | Return per-template contentHash + provenance for drift comparison | | list_templates_by_category | List templates for a specific category (uses byCategory index) |

template_type enum (all values):

"standard" | "mission" | "brief" | "runbook" | "document" | "checklist" | "doc-binary"

doc-binary template type (new in 1.8.0)

Use template_type="doc-binary" for Living Bible binary document templates. Four additional optional fields become meaningful:

| Field | Type | Description | |-------|------|-------------| | renderer_kind | string | Renderer identifier — e.g. "pdf", "docx", "html" | | input_schema | string | JSON-encoded schema string describing template inputs | | assets | object | Asset URLs: { icon?, banner?, thumbnail? } | | output_formats | string[] | Supported output formats — e.g. ["pdf", "docx"] |

Example: upsert a doc-binary template

upsert_template(
  name="employee-contract-v2",
  team="hephaistos",
  purpose="Generates employee contract PDFs from structured input",
  content="# Employee Contract\n\n{{name}}, {{start_date}}...",
  version="1.0.0",
  template_type="doc-binary",
  category="hr/contracts",
  renderer_kind="pdf",
  input_schema="{\"name\":{\"type\":\"string\"},\"start_date\":{\"type\":\"string\"}}",
  assets={"icon": "https://cdn.example.com/icons/contract.svg"},
  output_formats=["pdf", "docx"]
)

Template Consumers (new in 1.8.0)

The template_consumers junction table links templates to the components/BUs that consume them. This enables the Living Bible pattern — tracking which consumers depend on each doc-binary template.

Link type semantics (linkType):

  • "uses" — consumer actively consumes/renders this template
  • "produces" — consumer generates output documents from this template
  • "references" — informational cross-reference

| Tool | Type | Description | |------|------|-------------| | link_template_consumer | write | Upsert a link by (templateId, consumerName). Returns {linkId, created: true} on insert, {linkId, created: false} on update | | unlink_template_consumer | write | Hard-delete the link by (templateId, consumerName). Returns {unlinked: true} if found, {unlinked: false} if not | | list_consumers_for_template | read | List all consumers for a template — returns link objects with consumerName, consumerBU, consumerComponentId, linkType, createdAt. Optional linkType filter | | list_templates_for_consumer | read | Reverse lookup — enriched [{link, template}] for a consumerName. Optional linkType filter. Orphaned links skipped |

link_template_consumer params:

| Param | Type | Required | Description | |-------|------|----------|-------------| | templateId | string | yes | Convex document ID of the template | | consumerName | string | yes | Stable slug identifying the consumer — e.g. "hephaistos-doc-forge" | | consumerBU | string | no | Business unit slug — e.g. "hephaistos", "sigma", "omega" | | consumerComponentId | string | no | Convex document ID of the component row (omit for BU-level consumers without a registered components row) | | linkType | string | no | "uses", "produces", or "references" — omit to leave untyped | | createdBy | string | no | Orchestrator or script creating this link — e.g. "omega" |

unlink_template_consumer params:

| Param | Type | Required | Description | |-------|------|----------|-------------| | templateId | string | yes | Convex document ID of the template | | consumerName | string | yes | Slug identifying the consumer |

list_consumers_for_template params:

| Param | Type | Required | Description | |-------|------|----------|-------------| | templateId | string | yes | Convex document ID of the template | | linkType | string | no | Filter by link type — omit to return all |

list_templates_for_consumer params:

| Param | Type | Required | Description | |-------|------|----------|-------------| | consumerName | string | yes | Slug identifying the consumer | | linkType | string | no | Filter by link type — omit to return all |

Example invocations:

# Link a consumer to a template
link_template_consumer(
  templateId="j57abc123...",
  consumerName="hephaistos-doc-forge",
  consumerBU="hephaistos",
  linkType="uses",
  createdBy="omega"
)

# Remove a consumer link
unlink_template_consumer(templateId="j57abc123...", consumerName="hephaistos-doc-forge")

# Who consumes this template?
list_consumers_for_template(templateId="j57abc123...")

# What templates does this consumer use?
list_templates_for_consumer(consumerName="hephaistos-doc-forge", linkType="uses")

Runbooks

Added in 1.1.0. Runbooks are structured, versioned operational playbooks stored in VantageRegistry.

| Tool | Description | |------|-------------| | upsert_runbook | Create or update a runbook (upsert by name) | | get_runbook | Get a runbook by slug — optionally guard by version | | list_runbooks | List runbooks — optional status, category, team, applicability filters | | list_runbooks_by_category | List runbooks for a specific category (uses byCategory index) | | list_runbooks_by_team | List runbooks for a specific team (uses byTeam index) | | delete_runbook | Soft-delete a runbook — sets status to deprecated | | detect_runbook_drift | Return per-runbook vrHash (sha256 of content) + category + version for drift comparison (added in 1.6.0) |

Runbook status values: draft | published | deprecated

Example invocations:

# Get a specific runbook
get_runbook(name="deploy-production", version="1.0.0")

# List all published deployment runbooks
list_runbooks(status="published", category="deployment")

# List all runbooks for the core team
list_runbooks_by_team(team="core")

# List all published runbooks in the quality category
list_runbooks_by_category(category="quality", status="published")

# Soft-delete a runbook
delete_runbook(name="old-process-v1")

Upsert a runbook (minimal example):

upsert_runbook(
  name="onboard-agent",
  description="Standard protocol to onboard a new agent to the fleet",
  version="1.0.0",
  status="draft",
  category="onboarding",
  tags=["agent", "onboarding", "fleet"],
  content="# Onboard Agent\n\n...",
  phases=[{ name="prep", description="Preparation phase", steps=[], gate=null }],
  inputs=[],
  outputs=[],
  applicability={ orchestrators=["omega"], business_units=[], use_cases=[] },
  author="omega",
  team="core",
  related_skills=[],
  related_agents=[],
  linked_templates=[]
)

Components Catalog

| Tool | Description | |------|-------------| | register_component | Create or update a component (upsert by name+kind) | | list_components | List components — optional kind, ownerTeam, status, tags filters. New in 1.8.0: response includes consumers, clientReadyStage, lastUsageSignal | | get_component | Get a component by Convex document ID. New in 1.8.0: response includes consumers, clientReadyStage, lastUsageSignal | | search_components | Search components by name prefix | | update_component | Patch individual fields on an existing component | | delete_component | Soft-delete a component — sets status to deprecated |

Component Bible fields (new in 1.8.0)

Three fields are now surfaced in list_components and get_component responses:

| Field | Type | Description | |-------|------|-------------| | consumers | string[] | Downstream orchestrators / agents that consume this component — e.g. ["omega", "sigma"] | | clientReadyStage | string | Readiness stage for client-facing exposure: "internal-only", "dogfood", "private-beta", or "public-cloud-paid" | | lastUsageSignal | object | Latest usage signal: { source, value, capturedAt, raw? } — auto-updated on each get_component / list_components call when VR_ADMIN_WRITE_SECRET is configured |

These fields can be set via register_component or update_component:

register_component(
  name="check-messages",
  kind="skill",
  status="active",
  ownerTeam="core",
  consumers=["omega", "pi", "sigma"],
  clientReadyStage="internal-only"
)

Stats

| Tool | Description | |------|-------------| | get_stats | Registry overview — counts per table including runbooks breakdown |

get_stats response shape:

{
  "teams": 18,
  "agents": 148,
  "skills": 328,
  "plugins": 16,
  "hooks": 22,
  "runbooks_count": {
    "total": 12,
    "by_status": {
      "draft": 3,
      "published": 8,
      "deprecated": 1
    },
    "by_category": {
      "deployment": 4,
      "quality": 4,
      "onboarding": 4
    }
  },
  "total": 544
}

Schema

template_consumers table (new in 1.8.0)

| Field | Type | Notes | |-------|------|-------| | templateId | Id<"templates"> | Foreign key — template being consumed | | consumerName | string | Stable slug identifying the consumer | | consumerBU | string? | Business unit slug — e.g. "hephaistos" | | consumerComponentId | Id<"components">? | Optional FK to components row | | linkType | "uses" \| "produces" \| "references"? | Semantic relationship type | | createdAt | number | Unix timestamp (ms) | | createdBy | string? | Orchestrator or script that created this link |

Indexes: byTemplate, byConsumer, byTemplateAndConsumer (composite — enforces at-most-one link per pair)

runbooks table (new in 1.1.0)

| Field | Type | Notes | |-------|------|-------| | name | string | Unique slug — upsert key | | description | string | Purpose summary | | version | string | Semantic version | | status | draft \| published \| deprecated | Lifecycle state | | category | string | e.g. deployment, quality, onboarding | | tags | string[] | Searchable tags | | content | string | Full markdown content | | phases | Phase[] | Ordered phases with steps and gates | | inputs | RunbookInput[] | Required input parameters | | outputs | RunbookOutput[] | Produced output artifacts | | applicability | object | orchestrators, business_units, use_cases slugs | | author | string | Author slug | | team | string | Owning team slug | | related_skills | string[] | Referenced skill slugs | | related_agents | string[] | Referenced agent slugs | | linked_templates | LinkedTemplate[] | Templates used within this runbook |

Indexes: byName, byStatus, byCategory, byTeam

templates table

template_type discriminator field — all values as of 1.8.0:

| Value | Description | |-------|-------------| | standard | Standard template | | mission | Mission brief template | | brief | Agent/task brief | | runbook | Runbook template | | document | Free-form document | | checklist | Checklist template | | doc-binary | Living Bible binary document template (new in 1.8.0) — use with renderer_kind, input_schema, assets, output_formats |

components table — Bible fields (new in 1.8.0)

| Field | Type | Notes | |-------|------|-------| | consumers | string[]? | Downstream orchestrators / agents that consume this component | | clientReadyStage | string? | "internal-only" | "dogfood" | "private-beta" | "public-cloud-paid" | | lastUsageSignal | object? | { source, value, capturedAt, raw? } — auto-updated on every read |


Requirements

  • Bun runtime (server is authored in TypeScript for Bun)
  • CONVEX_URL environment variable pointing to the VantageRegistry Convex deployment (use .convex.cloud URL, not .convex.site)

ADMIN mode vs read-only mode (new in 1.7.0)

The MCP server operates in one of two modes depending on token configuration:

ADMIN mode (write operations enabled)

Requires both environment variables:

MCP_BEARER_TOKEN=<admin-token>       # HTTP transport only — identifies admin callers
VR_ADMIN_WRITE_SECRET=<secret>       # backend write guard secret (from PR #93)

Write tools (upsert_*, delete_*, register_component, update_component, link_runbook_template, unlink_runbook_template, link_template_consumer, unlink_template_consumer) inject adminSecret into every Convex mutation call server-side. adminSecret is never exposed in tool input schemas — clients do not provide it.

Read-only mode (write operations refused)

When the server is configured with MCP_BEARER_TOKEN_READONLY only (no admin token), all write tool calls are refused:

  • HTTP transport: returns 403 Forbidden before the handler executes.
  • stdio transport: adminWriteArgs() throws immediately — zero mutations fired.

A read-only instance cannot be made to write even if VR_ADMIN_WRITE_SECRET is present in its environment. The ADMIN mode gate is checked before the secret is injected.

Write tool list (all require ADMIN mode + VR_ADMIN_WRITE_SECRET)

upsert_team, upsert_agent, upsert_skill, upsert_skill_content, upsert_agent_content, upsert_plugin_content, upsert_hook_content, upsert_command_content, upsert_plugin, upsert_hook, upsert_prompt, upsert_template, upsert_test_run, upsert_skill_eval_corpus, upsert_runbook, delete_runbook, link_runbook_template, unlink_runbook_template, link_template_consumer, unlink_template_consumer, register_component, update_component, delete_component

Read tool list (work in both modes, no secret required)

All list_*, get_*, detect_*, search_components, get_stats.


Changelog

See CHANGELOG.md in this directory.


Orchestrator: Omega — VantageOS Team | 2026-06-18