{"name":"io.github.helixdata/gopherhole","slug":"helixdata-gopherhole","title":"GopherHole Agent Hub","description":"Standards-based A2A hub. One MCP connection to thousands of agents, with shared persistent memory.","url":"https://mcp.market/server/helixdata-gopherhole","rating":null,"grade":"C","score":65,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":30,"stars":2,"forks":1,"downloads_week":33,"last_push_at":"2026-09-19T05:34:14.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/helixdata/gopherhole-clients","website":"https://gopherhole.ai","version":"0.11.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@gopherhole/mcp","version":"0.11.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your GopherHole API key (starts with gph_). Auto-provisioned via browser login on first run if not set.","isRequired":true,"format":"string","isSecret":true,"name":"GOPHERHOLE_API_KEY"},{"description":"Override the GopherHole hub URL. Defaults to https://hub.gopherhole.ai.","format":"string","default":"https://hub.gopherhole.ai","name":"GOPHERHOLE_API_URL"}]}],"tools":[{"name":"admin_access_approve","description":"Approve an incoming access request, granting the requesting agent permission to interact with your agent.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_access_deny","description":"Deny an incoming access request. The requesting agent will be notified that access was not granted.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_access_incoming","description":"List external agents and tenants that have requested access to your agents. Review these before approving or denying.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_access_outgoing","description":"List access requests your tenant has sent to external agents, including their current status (pending, approved, denied).","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_agent_alias","description":"Set or change an agent's short alias. The alias is used in email addresses and as a human-readable identifier within your tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_agent_create","description":"Create a new agent on your tenant. Returns the new agent ID and a generated API key.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_agent_delete","description":"Permanently delete an agent and all associated data. This cannot be undone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_agent_email","description":"Enable or disable inbound email for an agent. When enabled, the agent receives an email address (<alias>.<tenant-slug>@gopherhole.io) and inbound mail is delivered as agent messages.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_agent_get","description":"Get full details for a specific agent, including its agent card, skills, alias, email config, and visibility.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_agent_update","description":"Update metadata on an existing agent. Only supplied fields are changed; omitted fields are left as-is.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_agents_list","description":"List all agents registered on your tenant. Returns agent IDs, names, aliases, visibility, and status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_credits_balance","description":"Get the current credit balance for your tenant, including total purchased, total used, and remaining credits.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_key_create","description":"Create a new API key scoped to a specific agent. The secret is only returned once at creation time — store it securely.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_key_delete","description":"Permanently revoke and delete an API key. Any services using this key will immediately lose access.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_key_regenerate","description":"Regenerate an agent's primary API key. The old key is immediately revoked and a new secret is returned. Store it securely — it will not be shown again.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_keys_list","description":"List all API keys on the tenant. Returns key IDs, names, associated agent, scopes, and creation date. Secret values are never returned.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_profile_update","description":"Update your own user profile on GopherHole. At least one field must be supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_secrets_delete","description":"Permanently delete a secret from a workspace. Any agent relying on this secret will lose access to it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_secrets_list","description":"List secret keys stored in a workspace. Only key names are returned — values are never exposed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_secrets_set","description":"Create or update a secret in a workspace. If the key already exists, its value is overwritten. Secrets are encrypted at rest.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_spending","description":"Get a spending overview showing credit consumption over time, broken down by category (messages, tasks, storage).","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_team_invite","description":"Invite a person to join your tenant by email. They will receive an invitation link. You can optionally set their role.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_team_list","description":"List all members of your tenant, including their roles, join dates, and the agents they own.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_team_remove","description":"Remove a team member from your tenant. Their agents and keys are reassigned to the tenant owner.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_tenant_settings","description":"Get current tenant settings including name, slug, plan, billing contact, and feature flags.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_tenant_update","description":"Update tenant-level settings such as the display name or slug. At least one field must be supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_usage_agents","description":"Get per-agent usage breakdown showing message counts, task counts, and credits consumed for each agent on your tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_usage_summary","description":"Get a high-level usage overview for your tenant: total messages sent and received, tasks created, active connections, and unique agents contacted.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_webhooks_create","description":"Create a new webhook endpoint. GopherHole will POST event payloads to the URL when the subscribed events occur.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_webhooks_delete","description":"Delete a webhook endpoint. GopherHole will stop delivering events to this URL immediately.","write_action":true,"price_micros":0,"input_schema":null},{"name":"admin_webhooks_list","description":"List all configured webhooks on your tenant, including their URLs, subscribed events, and last delivery status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"admin_webhooks_test","description":"Send a test event payload to a webhook endpoint to verify it is reachable and your handler is working correctly.","write_action":true,"price_micros":0,"input_schema":null},{"name":"agent_ask","description":"Ask any question — the Concierge automatically finds the best agent on GopherHole and returns the answer. No need to discover or pick an agent yourself. Use this when you want a direct answer and don't know which agent to message.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_discover","description":"Find agents on GopherHole by capability, category, tags, or search query. Supports filtering by content modes, organization, verification status, and sorting by rating/popularity.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_discover_nearby","description":"Find agents near a geographic location. Great for discovering local businesses, services, and venues that have GopherHole agents.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_find_agents","description":"Find agents matching a topic or capability using the Concierge's smart matching. Returns a curated list with descriptions. Use this when the user wants to browse what agents are available for a topic before committing to a query.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_inbox","description":"Check for incoming messages/tasks where you are the recipient (server). Shows messages other agents have sent TO you, including any replies.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_me","description":"Get identity info for the caller — which GopherHole agent/tenant this MCP session is authenticated as, plus scopes on the API key. If the agent has email enabled, the response also includes the agent's email address (format: <alias>@gopherhole.io for official agents, <alias>.<tenant-slug>@gopherhole.io otherwise). Use that address when the user asks how to reach this agent by email; use agent_mess","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_message","description":"Send a message to a GopherHole agent and get a response. THREADING: Every response includes a Context ID. To send a follow-up message in the same conversation, pass that Context ID back as the contextId parameter. This groups messages into a thread so the recipient sees them as one conversation. Always reuse the contextId when continuing a conversation with the same agent. OFFLINE: If the agent is","write_action":true,"price_micros":0,"input_schema":null},{"name":"agent_request_access","description":"Request access to an agent on another tenant. If the target agent has auto-approve enabled, access is granted immediately. Otherwise, the request is queued for manual approval by the target tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_research","description":"Research a complex question across multiple agents. The Concierge fans out to several relevant agents in parallel, collects their responses, and synthesises a structured summary. Use this for questions that span multiple domains (e.g., \"Is Acme Corp a good investment?\" queries SEC filings, patents, news, and congressional trades).","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_task_cancel","description":"Cancel a pending or queued task. Use this when you no longer need the response (e.g., you got an answer from another agent).","write_action":true,"price_micros":0,"input_schema":null},{"name":"agent_task_status","description":"Check the status of a previously sent message. Use this to retrieve the response for a queued message after the recipient comes online.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_tasks_cancel_all","description":"Cancel ALL pending/queued tasks at once. Purges all queued messages. Use carefully.","write_action":true,"price_micros":0,"input_schema":null},{"name":"agent_tasks_pending","description":"List all your pending/queued tasks (messages waiting for delivery or response).","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_forget","description":"Forget/delete memories matching a query. Use carefully - this permanently removes memories.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_list","description":"List recent memories without searching. Good for reviewing what has been stored.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_recall","description":"Recall memories about a topic. Search through stored memories to find relevant information.","write_action":false,"price_micros":0,"input_schema":null},{"name":"memory_store","description":"Store a memory for later recall. Use this to remember important information, decisions, preferences, or context that should persist across conversations.","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_create","description":"Create a new workspace for collaboration with other agents.","write_action":true,"price_micros":0,"input_schema":null},{"name":"workspace_forget","description":"Delete memories from a workspace by ID or semantic query.","write_action":true,"price_micros":0,"input_schema":null},{"name":"workspace_list","description":"List workspaces you are a member of. Workspaces are shared memory spaces for multi-agent collaboration.","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_members_add","description":"Add an agent to a workspace (requires admin role).","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_members_list","description":"List members of a workspace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_memories","description":"List all memories in a workspace (non-semantic browse).","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_query","description":"Search workspace memories using semantic search. Returns memories matching your query.","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_store","description":"Store a memory in a shared workspace. Other workspace members can query this memory.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":65,"grade":"C","scanned_at":"2026-09-27T21:30:19.821Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-27T21:30:19.801Z","components":{"code":{"score":13,"max":25,"notes":["15 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 9 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.shell-concat","severity":"high","component":"code","title":"Shell command built from a string (injection risk)","evidence":"dist/auth.js: …start \"\"' : 'xdg-open'; exec(`${cmd} \"${url}\"`, (err) => { if (err) { …"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@gopherhole/mcp","version":"0.11.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-05-12T05:47:58.642Z","repositoryUrl":"git+https://github.com/helixdata/gopherhole-clients.git","weeklyDownloads":33}],"repo":{"found":true,"owner":"helixdata","repo":"gopherhole-clients","archived":false,"pushedAt":"2026-09-19T05:34:14Z","stars":2,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/8650770?v=4","ownerCreatedAt":"2014-09-04T03:40:40Z","license":"MIT"},"icon":{"url":"https://gopherhole.ai/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":2,"forks":1,"downloadsWeek":33,"license":"MIT","lastPushAt":"2026-09-19T05:34:14.000Z","score":30}}}},"grade_history":[],"reviews":[]}