Less noise. Better agents. tap is one MCP server that stands in for all of yours. Your agent loads two tools instead of every tool from every server, and finds the rest when it needs them.
One binary, no Node runtime. Ready in 3 ms. Linux and macOS.
Every tool, before the first word. Each MCP server you connect loads every one of its tools into your agent’s context, used or not. These are real servers, with the tools they list today. Pick the ones you use.
Your agent’s context47,700 of 200,000 tokens
- github.add_comment_to_pending_review
- github.list_issue_fields
- supabase.search_docs
- supabase.create_branch
- cloudflare.r2_put_object
- cloudflare.queue_update_visibility
- cloudflare.service_binding_delete
- cloudflare.version_rollback
- notion.API-retrieve-a-database
- playwright.browser_click
- devtools.get_css_styles
- github.add_issue_comment
- github.list_issue_types
- supabase.list_organizations
- supabase.list_branches
- cloudflare.r2_delete_object
- cloudflare.ai_inference
- cloudflare.service_binding_list
- cloudflare.wrangler_config_get
- notion.API-move-page
- playwright.browser_drag
- devtools.get_network_request
- github.add_reply_to_pull_request_comment
- github.list_issues
- supabase.get_organization
- supabase.delete_branch
- cloudflare.d1_list_databases
- cloudflare.ai_list_models
- cloudflare.service_binding_update
- cloudflare.wrangler_config_update
- notion.API-retrieve-page-markdown
- playwright.browser_hover
- devtools.handle_dialog
- github.assign_copilot_to_issue
- github.list_pull_requests
- supabase.list_projects
- supabase.merge_branch
- cloudflare.d1_create_database
- cloudflare.ai_get_model
- cloudflare.env_var_set
- notion.API-get-user
- notion.API-update-page-markdown
- playwright.browser_select_option
- devtools.hover
- github.create_branch
- github.list_releases
- supabase.get_project
- supabase.reset_branch
- cloudflare.d1_delete_database
- cloudflare.ai_embeddings
- cloudflare.env_var_delete
- notion.API-get-users
- playwright.browser_close
- playwright.browser_tabs
- devtools.lighthouse_audit
- github.create_or_update_file
- github.list_repository_collaborators
- supabase.get_cost
- supabase.rebase_branch
- cloudflare.d1_query
- cloudflare.ai_text_generation
- cloudflare.env_var_list
- notion.API-get-self
- playwright.browser_resize
- playwright.browser_wait_for
- devtools.list_console_messages
- github.create_pull_request
- github.list_tags
- supabase.confirm_cost
- cloudflare.get_kvs
- cloudflare.do_create_namespace
- cloudflare.ai_image_generation
- cloudflare.env_var_bulk_set
- notion.API-post-search
- playwright.browser_console_messages
- sentry.find_organizations
- devtools.list_network_requests
- github.create_repository
- github.merge_pull_request
- supabase.create_project
- cloudflare.kv_get
- cloudflare.do_delete_namespace
- cloudflare.workflow_get
- cloudflare.route_create
- notion.API-get-block-children
- playwright.browser_handle_dialog
- sentry.find_projects
- devtools.list_pages
- github.delete_file
- github.pull_request_read
- supabase.pause_project
- cloudflare.kv_put
- cloudflare.do_list_namespaces
- cloudflare.workflow_create
- cloudflare.route_delete
- notion.API-patch-block-children
- playwright.browser_emulate_media
- sentry.update_issue
- devtools.navigate_page
- github.fork_repository
- github.pull_request_review_write
- supabase.restore_project
- cloudflare.kv_delete
- cloudflare.do_get_object
- cloudflare.workflow_delete
- cloudflare.route_list
- notion.API-retrieve-a-block
- playwright.browser_evaluate
- sentry.search_events
- devtools.new_page
- github.get_commit
- github.push_files
- supabase.list_tables
- cloudflare.kv_list
- cloudflare.do_list_objects
- cloudflare.workflow_list
- cloudflare.route_update
- notion.API-update-a-block
- playwright.browser_file_upload
- sentry.analyze_issue_with_seer
- devtools.performance_analyze_insight
- github.get_file_contents
- github.request_copilot_review
- supabase.list_extensions
- cloudflare.worker_list
- cloudflare.do_delete_object
- cloudflare.workflow_update
- cloudflare.cron_create
- notion.API-delete-a-block
- playwright.browser_drop
- sentry.search_issues
- devtools.performance_start_trace
- github.get_label
- github.search_code
- supabase.list_migrations
- cloudflare.worker_get
- cloudflare.do_alarm_list
- cloudflare.workflow_execute
- cloudflare.cron_delete
- notion.API-retrieve-a-page
- playwright.browser_find
- sentry.get_sentry_resource
- devtools.performance_stop_trace
- github.get_latest_release
- github.search_commits
- supabase.apply_migration
- cloudflare.worker_put
- cloudflare.do_alarm_set
- cloudflare.template_list
- cloudflare.cron_list
- notion.API-patch-page
- playwright.browser_fill_form
- sentry.search_sentry_tools
- devtools.press_key
- github.get_me
- github.search_issues
- supabase.execute_sql
- cloudflare.worker_delete
- cloudflare.do_alarm_delete
- cloudflare.template_get
- cloudflare.cron_update
- notion.API-post-page
- playwright.browser_press_key
- sentry.execute_sentry_tool
- devtools.resize_page
- github.get_release_by_tag
- github.search_pull_requests
- supabase.query_logs
- cloudflare.worker_deploy
- cloudflare.queue_create
- cloudflare.template_create_worker
- cloudflare.zones_list
- notion.API-retrieve-a-page-property
- playwright.browser_type
- devtools.click
- devtools.select_page
- github.get_tag
- github.search_repositories
- supabase.get_advisors
- cloudflare.analytics_get
- cloudflare.queue_delete
- cloudflare.wfp_create_dispatch_namespace
- cloudflare.zones_get
- notion.API-retrieve-a-comment
- playwright.browser_navigate
- devtools.close_page
- devtools.take_heapsnapshot
- github.get_team_members
- github.search_users
- supabase.get_project_url
- cloudflare.workers_analytics_search
- cloudflare.queue_list
- cloudflare.wfp_delete_dispatch_namespace
- cloudflare.domain_list
- notion.API-create-a-comment
- playwright.browser_navigate_back
- devtools.drag
- devtools.take_screenshot
- github.get_teams
- github.sub_issue_write
- supabase.get_publishable_keys
- cloudflare.r2_list_buckets
- cloudflare.queue_get
- cloudflare.wfp_list_dispatch_namespaces
- cloudflare.secret_put
- notion.API-query-data-source
- playwright.browser_network_requests
- devtools.emulate
- devtools.take_snapshot
- github.issue_read
- github.ui_get
- supabase.generate_typescript_types
- cloudflare.r2_create_bucket
- cloudflare.queue_send_message
- cloudflare.wfp_add_custom_domain
- cloudflare.secret_delete
- notion.API-retrieve-a-data-source
- playwright.browser_network_request
- devtools.evaluate_script
- devtools.type_text
- github.issue_write
- github.update_issue_comment
- supabase.list_edge_functions
- cloudflare.r2_delete_bucket
- cloudflare.queue_send_batch
- cloudflare.wfp_remove_custom_domain
- cloudflare.secret_list
- notion.API-update-a-data-source
- playwright.browser_run_code_unsafe
- devtools.fill
- devtools.upload_file
- github.list_branches
- github.update_pull_request
- supabase.get_edge_function
- cloudflare.r2_list_objects
- cloudflare.queue_get_message
- cloudflare.wfp_list_custom_domains
- cloudflare.version_list
- notion.API-create-a-data-source
- playwright.browser_take_screenshot
- devtools.fill_form
- devtools.wait_for
- github.list_commits
- github.update_pull_request_branch
- supabase.deploy_edge_function
- cloudflare.r2_get_object
- cloudflare.queue_delete_message
- cloudflare.service_binding_create
- cloudflare.version_get
- notion.API-list-data-source-templates
- playwright.browser_snapshot
- devtools.get_console_message
- and 183201 more
- plugin_searchFinds a tool on any server, with what it takes to call it.
- plugin_callRuns one by its id.
- The rest is room for the work.
tap is off. 213 tools load as your agent starts: 24% of its context, before your first word.
Why put tap in between. Every agent you use keeps its own list of servers and loads all of their tools. With tap in between, each agent keeps one server and loads two tools.
Without tap
- Claude Code
- Codex
- OpenCode
- GitHub
- Supabase
- Cloudflare
- Notion
- Playwright
Tools loaded213
Context used47,700 tokens
Servers startedAll five, every session
Adding a serverEdit every agent’s config
ConfigThree files, three formats
With tap
- Claude Code
- Codex
- OpenCode
- GitHub
- Supabase
- Cloudflare
- Notion
- Playwright
Tools loaded2
Context used300 tokens
Servers startedNone until tap is used
Adding a serverOne command, no restart
ConfigOne file for every agent
Small and quick. Measured against mcpzip, lazy-mcp and mcp-funnel, three other proxies that load a few tools in place of all of them, on the same machine with the same five servers. Medians of 30 runs.
3 ms to be ready. What your agent waits for as it starts.
7.5 ms to a first result. Start, find a tool, call it.
18 MB of memory at its peak. With 213 tools behind it.
300 tokens in your agent’s context. The tools each one loads.
Set it up once. Three steps. After that a new server is one command, and your agents find it on their next search.
More than one machine? One can serve its servers to the rest over HTTPS, so there is one set to keep. How remote works
- 1
Install tap. It needs Go 1.26 or newer. Other ways to install
Terminal
go install github.com/
fschrhunt/ tap/ cmd/ tap@latest - 2
Connect your agent. tap becomes the one MCP server it starts. One command connects every agent it finds. What tap connect does
Terminal
tap connect
Or wire it up yourself:
Terminal
claude mcp add --scope user tap -- tap
~/.codex/config.toml
[mcp_servers.tap] command = "tap"
opencode.jsonc
{ "mcp": { "servers": { "tap": { "type": "local", "command": ["tap"] } } } }
Your client’s MCP config
{ "mcpServers": { "tap": { "command": "tap" } } }
- 3
Move your servers behind it. Import the ones your agents already have, or add one by its address or its command. A server that has you sign in takes one more command. Every option
Terminal
tap import tap add playwright -- npx -y @playwright/mcp@latest tap add linear https:/
/ mcp.linear.app/ mcp tap auth linear