-
Notifications
You must be signed in to change notification settings - Fork 0
Operations
Every merge to main runs three jobs in order:
-
test —
mix format --check-formatted, compile with warnings as errors, and the test suite. - deploy — builds a release and installs it on the host, running migrations on start.
-
publish-mcp-registry — republishes
server.jsonto the official MCP Registry (below).
deploy/deploy.sh does the same by hand, and sets up a new host.
The last job publishes MCP Harbor as io.github.lbesecker195/mcp-registry-search-directory, authenticating with GitHub OIDC, so there is no secret to manage.
- It publishes only when the registry answers
404for the current version. A5xxis retried and then skipped with a warning — a deploy never fails because the registry had a bad moment. To publish changed metadata, bumpversioninserver.json. -
Renaming: add the old name to
RETIRED_SERVER_NAMESin the workflow. It is marked deleted before the new name is published, because the registry allows one active server per endpoint URL and treats one server under several names as spam.
Set in the host's environment file.
| Variable | Purpose |
|---|---|
PHX_HOST, PORT, PHX_IP, PHX_SERVER
|
where the site is served |
DATABASE_URL, POOL_SIZE
|
PostgreSQL |
SECRET_KEY_BASE |
session signing |
REGISTRY_PUBLISH_TOKEN |
lets API and MCP submissions publish immediately, and authorises review |
MCP_REGISTRY_LICENSE_KEY |
required for the app to start; ask the project owner for one |
OFFICIAL_REGISTRY_SYNC |
the 6-hourly mirror of the official registry |
PROBE_ENABLED, PROBE_BATCH_SIZE, PROBE_CONCURRENCY
|
the prober |
DOCUMENTS_ENABLED |
the llms.txt / AGENTS.md fetcher |
DISCOVERY_PUSH, INDEXNOW_KEY
|
announcing new and changed pages to search engines |
GEO_BLOCK_ENABLED, GEOIP_SOURCE, MAXMIND_LICENSE_KEY
|
optional city-level geo block; off unless enabled |
SSA_ACCOUNT_ID, SSA_PROJECT
|
usage analytics via SeriouslySimpleAnalytics |
Each scheduler can be switched off on its own with its *_ENABLED variable and a restart; no code change is needed.
The app runs under systemd with MemoryHigh=2G (soft — the kernel throttles past it) and MemoryMax=3G (hard). If pages slow down while the host has free memory, read the service's cgroup memory.events: a rising high count means the app is being throttled at its own limit, not starved by the machine.
On the host, against the running release:
bin/mcp_registry rpc "McpRegistry.OfficialRegistry.sync()"
bin/mcp_registry rpc "McpRegistry.Probe.Runner.run_batch(limit: 100)"
bin/mcp_registry rpc "McpRegistry.Documents.check_batch()"OfficialRegistry.sync(reapply: true) pushes every upstream entry through the mapping again — needed once after the mapping starts reading a new server.json field. It writes only rows that actually change and announces nothing.
Locally, as Mix tasks: mix registry.sync_official, mix probe.tools, mix mcp.approve <name>, mix discovery.announce, mix content.generate.
MCP Harbor · MCP server changelog · Apache 2.0
Using it
How it works
Running it