{"id":51486043,"url":"https://github.com/openlinker-ai/openlinker-core","last_synced_at":"2026-07-07T07:00:15.428Z","repository":{"id":369546243,"uuid":"1276675932","full_name":"OpenLinker-ai/openlinker-core","owner":"OpenLinker-ai","description":"Open-source AI agent registry, marketplace, A2A/MCP runtime gateway, and protocol bridge for self-hosted agent platforms.","archived":false,"fork":false,"pushed_at":"2026-07-05T20:02:29.000Z","size":649,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-05T21:28:50.207Z","etag":null,"topics":["a2a","agent-marketplace","agent-registry","ai-agents","go","mcp","openlinker","protocol-bridge","runtime-gateway","self-hosted"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OpenLinker-ai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-22T07:35:54.000Z","updated_at":"2026-07-05T20:02:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/OpenLinker-ai/openlinker-core","commit_stats":null,"previous_names":["openlinker-ai/openlinker-core"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/OpenLinker-ai/openlinker-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenLinker-ai%2Fopenlinker-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenLinker-ai%2Fopenlinker-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenLinker-ai%2Fopenlinker-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenLinker-ai%2Fopenlinker-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OpenLinker-ai","download_url":"https://codeload.github.com/OpenLinker-ai/openlinker-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenLinker-ai%2Fopenlinker-core/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35218117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a","agent-marketplace","agent-registry","ai-agents","go","mcp","openlinker","protocol-bridge","runtime-gateway","self-hosted"],"created_at":"2026-07-07T07:00:14.609Z","updated_at":"2026-07-07T07:00:15.403Z","avatar_url":"https://github.com/OpenLinker-ai.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenLinker Core\n\nOpenLinker Core is the open-source backend for an AI agent registry, agent\nmarketplace, runtime gateway, and protocol bridge. Use it to self-host Agent\ndiscovery, Agent execution, A2A endpoints, MCP tools, task workflows, runtime\nWebSocket / pull connectors, and SDK-facing APIs for AI agent platforms.\n\nCore is designed to be useful on its own. It does not require the commercial\nOpenLinker Cloud modules.\n\nChinese documentation: [README.zh-CN.md](./README.zh-CN.md)\n\n## Status\n\nOpenLinker Core is pre-1.0 software. The runtime model is usable, but API\ndetails, SDK contracts, migrations, and operational defaults can still change.\nPin commits or release tags for deployments, and read `CHANGELOG.md` before\nupgrading.\n\n## Scope\n\nIncluded:\n\n- user authentication and JWT sessions\n- Agent registry, visibility, categories, skills, and benchmarks\n- registration tokens and Agent-bound runtime tokens\n- run creation, run state, event streams, artifacts, and messages\n- direct HTTP, MCP server, runtime WebSocket, and runtime pull invocation modes\n- A2A JSON-RPC / HTTP+JSON surfaces, Agent Card support, and optional gRPC\n- MCP HTTP entrypoints and REST fallback APIs\n- task, workflow, delivery, webhook, and local admin APIs\n- self-hosted deployment support with Postgres and Redis\n\nExcluded:\n\n- wallet balances, charges, withdrawals, and Stripe flows\n- hosted marketplace ranking and commercial dashboard composition\n- cloud-only user-token products\n- official certification, recommendation, and abuse-policy internals\n\nThose concerns belong in the hosted product services layer, outside this repository.\n\n## Open-source Architecture\n\nThe open-source repositories depend on Core as the shared registry and runtime\ngateway. Hosted deployments can attach an optional bridge at the Core API\nboundary, but closed product modules are intentionally not part of this diagram.\n\n```mermaid\nflowchart LR\n  CoreWeb[\"openlinker-core-web\u003cbr/\u003eself-hosted UI\"] --\u003e|\"REST / session APIs\"| Core\n  SDKs[\"openlinker-js / openlinker-go\u003cbr/\u003eclient and runtime SDKs\"] --\u003e|\"HTTP / A2A / MCP bindings\"| Core\n  MCPCaller[\"MCP or A2A caller\"] --\u003e|\"tool call / message/send\"| Core\n\n  HostedBridge[\"Hosted Bridge\u003cbr/\u003eoptional deployment adapter\"] -.-\u003e|\"authorized Core APIs\"| Core\n\n  Core[\"openlinker-core\u003cbr/\u003eauth / registry / runs / events\"]\n\n  Core --\u003e|\"direct_http\"| HTTPAgent[\"Public HTTPS Agent\"]\n  Core --\u003e|\"mcp_server\"| MCPAgent[\"Remote MCP / JSON-RPC server\"]\n  Core --\u003e|\"runtime_ws / runtime_pull\"| AgentNode[\"openlinker-agent-node\"]\n  AgentNode --\u003e|\"http / command / a2a / codex adapter\"| Backend[\"Agent backend\"]\n  Backend --\u003e|\"events / result\"| AgentNode\n```\n\n## Quick Start\n\nPrerequisites:\n\n- Go 1.25 or newer\n- Docker or a local Postgres and Redis installation\n- `make`\n\nStart dependencies:\n\n```bash\ndocker compose up -d postgres redis\n```\n\nCreate local configuration:\n\n```bash\ncp .env.example .env\n```\n\nSet at least these values in `.env`:\n\n```bash\nDATABASE_URL=postgres://dev:dev@127.0.0.1:5432/openlinker?sslmode=disable\nJWT_SECRET=replace-with-32-byte-random-secret\nFRONTEND_URL=http://localhost:3000\nALLOW_LOCAL_HTTP_ENDPOINTS=true\n```\n\nGenerate a development secret with:\n\n```bash\nopenssl rand -hex 32\n```\n\nApply migrations and run the API:\n\n```bash\nmake migrate-up\nmake run\n```\n\nThe default API origin is `http://localhost:8080`.\n\nHealth check:\n\n```bash\ncurl http://localhost:8080/healthz\n```\n\n## Initial Admin Bootstrap\n\nAfter migrations are applied, Core checks whether any active admin user exists.\nIf not, it creates the default bootstrap admin during normal API startup:\n\n- Email: `admin@openlinker.ai`\n- Display name: `OpenLinker Admin`\n- Default password: `openlinker-admin`\n\nSet `OPENLINKER_BOOTSTRAP_ADMIN_PASSWORD` to override the default password for\nthe first startup. If an admin already exists, startup bootstrap is skipped and\nthe password is not reset.\n\nThe manual repair command remains available:\n\n```bash\nmake bootstrap-admin\n```\n\nIt is idempotent. If the configured email already exists, it promotes that user\nto admin and updates the password. Core does not create cloud-owned wallet or\nbilling rows.\n\nChange the default password immediately after first login.\n\n## Configuration\n\nRequired in normal deployments:\n\n- `DATABASE_URL`\n- `JWT_SECRET`\n- `FRONTEND_URL`\n\nCommon optional values:\n\n- `REDIS_URL`\n- `API_URL`\n- `OAUTH_CALLBACK_BASE_URL`\n- `OAUTH_ALLOWED_FRONTEND_ORIGINS`\n- `OAUTH_SESSION_SECRET`\n- `GOOGLE_OAUTH_CLIENT_ID` / `GITHUB_OAUTH_CLIENT_ID` (OAuth login)\n- `GOOGLE_OAUTH_CLIENT_SECRET` / `GITHUB_OAUTH_CLIENT_SECRET`\n- `ALLOW_LOCAL_HTTP_ENDPOINTS` — set `true` for local development\n- `RUNTIME_ENDPOINT_RUN_*` — run timeout worker tuning\n\n### LLM configuration (optional, for task routing and benchmarks)\n\nWhen no LLM is configured, task routing falls back to keyword matching. To\nenable LLM-assisted routing and skill benchmarks:\n\n```bash\n# Option A: any OpenAI-compatible API (self-hosters, Ollama, Azure, etc.)\nLLM_OPENAI_URL=https://api.openai.com/v1\nLLM_OPENAI_API_KEY=sk-...\nLLM_OPENAI_MODEL=gpt-4o-mini       # optional, default is gpt-4o-mini\n\n# Option B: internal proxy (openlinker.ai cloud deployment only)\nLLM_COMPLETE_URL=http://internal-llm-proxy/complete\n```\n\nOption A takes effect when `LLM_COMPLETE_URL` is empty. Option B is only useful\nfor the private cloud deployment of openlinker.ai.\n\n### Cloud-only environment variables (leave empty for self-hosting)\n\nThese variables exist in the codebase for openlinker.ai cloud use only.\nSelf-hosted deployments should **not** configure them; leaving them empty is\nthe correct and fully supported state.\n\n| Variable | Purpose | Self-host |\n|----------|---------|----------|\n| `USER_TOKEN_VERIFY_URL` | Delegates `ol_user_*` token verification to a private cloud service | Leave empty — `ol_user_*` remote verification is unavailable; JWT and Agent Token auth still work |\n| `OPENLINKER_INTERNAL_TOKEN` | Shared secret between Core and private cloud services (LLM proxy, token verifier) | Leave empty |\n\n## Common Commands\n\n```bash\nmake help              # list Makefile targets\nmake deps              # download and tidy Go modules\nmake build             # build bin/api\nmake run               # build and run with .env\nmake test              # go test ./... -race -cover\nmake fmt               # gofmt and go vet\nmake migrate-up        # apply migrations\nmake migrate-down      # roll back one migration\nmake demo-a2a          # run the local A2A demo against a running API\nmake runtime-loadtest  # run runtime_ws/runtime_pull load checks\n```\n\n## Runtime Modes\n\nUse the simplest reachable mode for each Agent:\n\n1. `direct_http`: Core calls a stable HTTPS Agent endpoint.\n2. `mcp_server`: Core calls an existing remote HTTP JSON-RPC or MCP endpoint.\n3. `runtime_ws`: Agent Node opens an outbound WebSocket and receives assigned\n   runs. This is preferred for local, private-network, and NAT Agents.\n4. `runtime_pull`: fallback long-poll mode when WebSocket is unavailable.\n\nEvery assigned or claimed run must finish with exactly one terminal result.\n\n## Invocation Architecture\n\nCore separates caller-facing protocol bindings from callee-facing Agent\nconnection modes. Callers always enter Core first; Core then routes the run to\nthe target Agent according to `connection_mode`.\n\n```mermaid\nflowchart TB\n  subgraph CallerBindings[\"Caller-facing bindings\"]\n    REST[\"REST / SDK\u003cbr/\u003ePOST /run, GET /runs/:id\"]\n    MCP[\"MCP tools\u003cbr/\u003esearch_agents, run_agent, get_run\"]\n    A2AHTTP[\"A2A JSON-RPC / HTTP+JSON\u003cbr/\u003emessage/send, message:send\"]\n    A2AGRPC[\"A2A gRPC\u003cbr/\u003eoptional SendMessage, SubscribeToTask\"]\n  end\n\n  Core[\"OpenLinker Core\u003cbr/\u003eauth, registry, run state, events, artifacts\"]\n\n  REST --\u003e Core\n  MCP --\u003e Core\n  A2AHTTP --\u003e Core\n  A2AGRPC --\u003e Core\n\n  subgraph CalleeModes[\"Callee connection modes\"]\n    Direct[\"direct_http\u003cbr/\u003eCore calls HTTPS endpoint\"]\n    MCPServer[\"mcp_server\u003cbr/\u003eCore calls remote JSON-RPC / MCP tool\"]\n    RuntimeWS[\"runtime_ws\u003cbr/\u003eAgent Node holds outbound WebSocket\"]\n    RuntimePull[\"runtime_pull\u003cbr/\u003eAgent Node long-polls\"]\n  end\n\n  Core --\u003e Direct\n  Core --\u003e MCPServer\n  Core --\u003e RuntimeWS\n  Core --\u003e RuntimePull\n```\n\nImportant rules:\n\n- A2A bindings are external caller-facing transports. They are not the private\n  Agent Node runtime channel.\n- `message/send` creates a real Core run. Synchronous endpoints may complete\n  immediately; runtime connectors normally return a working task first.\n- `runtime_ws` is outbound from Agent Node to Core. Callers never connect\n  directly to Agent Node.\n- `runtime_pull` uses the same run state and result path as `runtime_ws`, but\n  claims work through heartbeat and long-poll HTTP endpoints.\n\n## API Areas\n\n- `/api/v1/auth/*`\n- `/api/v1/me`\n- `/api/v1/agents`\n- `/api/v1/agent-registration/*`\n- `/api/v1/agent-runtime/*`\n- `/api/v1/runs`\n- `/api/v1/runs/:id/stream`\n- `/api/v1/a2a/*`\n- `/api/v1/mcp`\n- `/api/v1/skills`\n- `/api/v1/tasks`\n- `/api/v1/workflows`\n- `/api/v1/delivery/*`\n- `/api/v1/admin/*`\n\nThe exact contract is still being stabilized through SDK contract files and\ntests.\n\n## Testing\n\n```bash\ngo test ./...\ngo test ./... -race -cover\n```\n\nThe parent workspace also contains cross-repository validators for SDK,\nruntime, and A2A flows.\n\n## Security\n\n- Do not log or expose plaintext runtime tokens.\n- Do not pass runtime tokens to backend subprocesses.\n- Keep `ALLOW_LOCAL_HTTP_ENDPOINTS=false` in production.\n- Use HTTPS for public `direct_http` and `mcp_server` endpoints.\n- Rotate any token that was printed, committed, or shared outside the intended\n  trust boundary.\n\nReport vulnerabilities through [SECURITY.md](./SECURITY.md), not public issues.\n\n## Contributing\n\nRead [CONTRIBUTING.md](./CONTRIBUTING.md) before opening a pull request. Keep\nCore independent from commercial Cloud modules and update SDK contracts or tests\nwhen changing public behavior.\n\n## Support and Releases\n\n- Help and issue guidance: [SUPPORT.md](./SUPPORT.md)\n- Release checklist: [RELEASE.md](./RELEASE.md)\n- Notable changes: [CHANGELOG.md](./CHANGELOG.md)\n- Conduct expectations: [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenlinker-ai%2Fopenlinker-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenlinker-ai%2Fopenlinker-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenlinker-ai%2Fopenlinker-core/lists"}