Skip to content

Instantly share code, notes, and snippets.

@ianjennings
Created June 18, 2026 16:01
Show Gist options
  • Select an option

  • Save ianjennings/98e32f7670122ed2e61efbb7bde9ab3d to your computer and use it in GitHub Desktop.

Select an option

Save ianjennings/98e32f7670122ed2e61efbb7bde9ab3d to your computer and use it in GitHub Desktop.
./simple-test.sh "Use playwright to open https://example.com and report the title."
{"type":"system","subtype":"init","cwd":"/Users/ianjennings/Development/mcp-coverage","session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","tools":["Task","TaskOutput","Bash","Glob","Grep","ExitPlanMode","Read","Edit","Write","NotebookEdit","WebFetch","TodoWrite","WebSearch","TaskStop","AskUserQuestion","Skill","EnterPlanMode","ToolSearch","mcp__claude_ai_Gmail__create_draft","mcp__claude_ai_Gmail__list_drafts","mcp__claude_ai_Gmail__get_thread","mcp__claude_ai_Gmail__search_threads","mcp__claude_ai_Gmail__label_thread","mcp__claude_ai_Gmail__unlabel_thread","mcp__claude_ai_Gmail__list_labels","mcp__claude_ai_Gmail__label_message","mcp__claude_ai_Gmail__unlabel_message","mcp__claude_ai_Gmail__create_label","mcp__claude_ai_Gmail__update_label","mcp__claude_ai_Gmail__delete_label","mcp__claude_ai_Google_Calendar__list_events","mcp__claude_ai_Google_Calendar__get_event","mcp__claude_ai_Google_Calendar__list_calendars","mcp__claude_ai_Google_Calendar__suggest_time","mcp__claude_ai_Google_Calendar__create_event","mcp__claude_ai_Google_Calendar__update_event","mcp__claude_ai_Google_Calendar__delete_event","mcp__claude_ai_Google_Calendar__respond_to_event","mcp__claude_ai_Zapier__discover_zapier_actions","mcp__claude_ai_Zapier__enable_zapier_action","mcp__claude_ai_Zapier__disable_zapier_action","mcp__claude_ai_Zapier__list_enabled_zapier_actions","mcp__claude_ai_Zapier__execute_zapier_read_action","mcp__claude_ai_Zapier__execute_zapier_write_action","mcp__claude_ai_Zapier__send_feedback","mcp__claude_ai_Zapier__auto_provision_mcp","mcp__claude_ai_Zapier__list_zapier_skills","mcp__claude_ai_Zapier__get_zapier_skill","mcp__claude_ai_Zapier__create_zapier_skill","mcp__claude_ai_Zapier__update_zapier_skill","mcp__claude_ai_Zapier__delete_zapier_skill","mcp__claude_ai_Zapier__get_configuration_url","mcp__claude_ai_Notion__notion-search","mcp__claude_ai_Notion__notion-fetch","mcp__claude_ai_Notion__notion-create-pages","mcp__claude_ai_Notion__notion-update-page","mcp__claude_ai_Notion__notion-move-pages","mcp__claude_ai_Notion__notion-duplicate-page","mcp__claude_ai_Notion__notion-create-database","mcp__claude_ai_Notion__notion-update-data-source","mcp__claude_ai_Notion__notion-create-comment","mcp__claude_ai_Notion__notion-get-comments","mcp__claude_ai_Notion__notion-get-teams","mcp__claude_ai_Notion__notion-get-users","mcp__claude_ai_Notion__notion-query-database-view","mcp__claude_ai_Notion__notion-query-meeting-notes","mcp__claude_ai_Notion__notion-create-view","mcp__claude_ai_Notion__notion-update-view","ListMcpResourcesTool","ReadMcpResourceTool","mcp__claude_ai_Slack__slack_send_message","mcp__claude_ai_Slack__slack_schedule_message","mcp__claude_ai_Slack__slack_add_reaction","mcp__claude_ai_Slack__slack_create_canvas","mcp__claude_ai_Slack__slack_update_canvas","mcp__claude_ai_Slack__slack_search_public","mcp__claude_ai_Slack__slack_search_public_and_private","mcp__claude_ai_Slack__slack_search_channels","mcp__claude_ai_Slack__slack_search_users","mcp__claude_ai_Slack__slack_read_channel","mcp__claude_ai_Slack__slack_read_thread","mcp__claude_ai_Slack__slack_read_canvas","mcp__claude_ai_Slack__slack_read_user_profile","mcp__claude_ai_Slack__slack_list_channel_members","mcp__claude_ai_Slack__slack_read_file","mcp__claude_ai_Slack__slack_send_message_draft","mcp__claude_ai_Slack__slack_search_emojis","mcp__claude_ai_Slack__slack_get_reactions","mcp__claude_ai_HubSpot__search_crm_objects","mcp__claude_ai_HubSpot__submit_feedback","mcp__claude_ai_HubSpot__get_campaign_contacts_by_type","mcp__claude_ai_HubSpot__manage_crm_objects","mcp__claude_ai_HubSpot__manage_landing_page","mcp__claude_ai_HubSpot__search_owners","mcp__claude_ai_HubSpot__get_campaign_analytics","mcp__claude_ai_HubSpot__query_crm_data","mcp__claude_ai_HubSpot__render_landing_page_ui","mcp__claude_ai_HubSpot__get_organization_details","mcp__claude_ai_HubSpot__get_content_analytics_report","mcp__claude_ai_HubSpot__get_properties","mcp__claude_ai_HubSpot__show_feedback_form","mcp__claude_ai_HubSpot__get_campaign_asset_metrics","mcp__claude_ai_HubSpot__search_properties","mcp__claude_ai_HubSpot__get_crm_objects","mcp__claude_ai_HubSpot__get_user_details","mcp__claude_ai_HubSpot__tool_guidance","mcp__claude_ai_PostHog__exec","mcp__claude_ai_Fireflies__fireflies_get_transcript","mcp__claude_ai_Fireflies__fireflies_get_summary","mcp__claude_ai_Fireflies__fireflies_get_transcripts","mcp__claude_ai_Fireflies__fireflies_get_active_meetings","mcp__claude_ai_Fireflies__fireflies_get_user","mcp__claude_ai_Fireflies__fireflies_get_usergroups","mcp__claude_ai_Fireflies__fireflies_get_user_contacts","mcp__claude_ai_Fireflies__fireflies_share_meeting","mcp__claude_ai_Fireflies__fireflies_revoke_meeting_access","mcp__claude_ai_Fireflies__fireflies_move_meeting","mcp__claude_ai_Fireflies__fireflies_update_meeting_privacy","mcp__claude_ai_Fireflies__fireflies_list_channels","mcp__claude_ai_Fireflies__fireflies_get_channel","mcp__claude_ai_Fireflies__fireflies_get_analytics","mcp__claude_ai_Fireflies__fireflies_get_rule_executions","mcp__claude_ai_Fireflies__fireflies_create_soundbite","mcp__claude_ai_Fireflies__fireflies_update_meeting_title","mcp__claude_ai_Fireflies__fireflies_get_soundbites","mcp__claude_ai_Fireflies__fireflies_search","mcp__claude_ai_Fireflies__fireflies_fetch","mcp__playwright__browser_close","mcp__playwright__browser_resize","mcp__playwright__browser_console_messages","mcp__playwright__browser_handle_dialog","mcp__playwright__browser_evaluate","mcp__playwright__browser_file_upload","mcp__playwright__browser_drop","mcp__playwright__browser_fill_form","mcp__playwright__browser_press_key","mcp__playwright__browser_type","mcp__playwright__browser_navigate","mcp__playwright__browser_navigate_back","mcp__playwright__browser_network_requests","mcp__playwright__browser_network_request","mcp__playwright__browser_run_code_unsafe","mcp__playwright__browser_take_screenshot","mcp__playwright__browser_snapshot","mcp__playwright__browser_click","mcp__playwright__browser_drag","mcp__playwright__browser_hover","mcp__playwright__browser_select_option","mcp__playwright__browser_tabs","mcp__playwright__browser_wait_for"],"mcp_servers":[{"name":"testdriver-cloud","status":"failed"},{"name":"claude.ai Linear","status":"needs-auth"},{"name":"claude.ai Google Drive","status":"needs-auth"},{"name":"claude.ai Stripe","status":"needs-auth"},{"name":"claude.ai MCP Everything","status":"failed"},{"name":"posthog","status":"needs-auth"},{"name":"claude.ai Sentry","status":"connected"},{"name":"claude.ai Gmail","status":"connected"},{"name":"claude.ai Google Calendar","status":"connected"},{"name":"claude.ai Zapier","status":"connected"},{"name":"claude.ai Notion","status":"connected"},{"name":"claude.ai Slack","status":"connected"},{"name":"claude.ai HubSpot","status":"connected"},{"name":"claude.ai PostHog","status":"connected"},{"name":"claude.ai Fireflies","status":"connected"},{"name":"playwright","status":"connected"},{"name":"testdriver","status":"failed"}],"model":"claude-opus-4-5-20251101","permissionMode":"default","slash_commands":["keybindings-help","testdriver:generating-tests","testdriver:performing-actions","testdriver:screenshot","testdriver:caching","testdriver:mouse-up","testdriver:click","testdriver:testdriver","testdriver:assert","testdriver:enterprise","testdriver:right-click","testdriver:customizing-devices","testdriver:ai","testdriver:what-is-testdriver","testdriver:making-assertions","create-mcp-app","testdriver:dashcam","testdriver:test-creator","testdriver:hover","find-skills","testdriver:reusable-code","testdriver:quickstart","testdriver:waiting-for-elements","testdriver:running-tests","testdriver:locating-elements","testdriver:self-hosted","testdriver:scroll","testdriver:aws-setup","testdriver:type","testdriver:variables","testdriver:secrets","testdriver:press-keys","testdriver:focus-application","testdriver:exec","testdriver:ci-cd","testdriver:captcha","testdriver:mouse-down","testdriver:client","testdriver:examples","testdriver:cloud","testdriver:device-config","testdriver:find","testdriver:double-click","testdriver:elements","mcp-apps:migrate-oai-app","mcp-apps:create-mcp-app","compact","context","cost","init","pr-comments","release-notes","review","security-review","mcp__claude_ai_HubSpot__analyze-contacts-lifecycle-stages","mcp__claude_ai_HubSpot__analyze-customer-tickets","mcp__claude_ai_HubSpot__analyze-successful-customer-journeys","mcp__claude_ai_HubSpot__list-my-assigned-contacts","mcp__claude_ai_HubSpot__list-my-assigned-tickets","mcp__claude_ai_HubSpot__check-connector-status"],"apiKeySource":"none","claude_code_version":"2.1.22","output_style":"default","agents":["Bash","general-purpose","statusline-setup","Explore","Plan","testdriver"],"skills":["keybindings-help","testdriver:generating-tests","testdriver:performing-actions","testdriver:screenshot","testdriver:caching","testdriver:mouse-up","testdriver:click","testdriver:testdriver","testdriver:assert","testdriver:enterprise","testdriver:right-click","testdriver:customizing-devices","testdriver:ai","testdriver:what-is-testdriver","testdriver:making-assertions","create-mcp-app","testdriver:dashcam","testdriver:test-creator","testdriver:hover","find-skills","testdriver:reusable-code","testdriver:quickstart","testdriver:waiting-for-elements","testdriver:running-tests","testdriver:locating-elements","testdriver:self-hosted","testdriver:scroll","testdriver:aws-setup","testdriver:type","testdriver:variables","testdriver:secrets","testdriver:press-keys","testdriver:focus-application","testdriver:exec","testdriver:ci-cd","testdriver:captcha","testdriver:mouse-down","testdriver:client","testdriver:examples","testdriver:cloud","testdriver:device-config","testdriver:find","testdriver:double-click","testdriver:elements","mcp-apps:migrate-oai-app","mcp-apps:create-mcp-app"],"plugins":[{"name":"mcp-apps","path":"/Users/ianjennings/.claude/plugins/cache/mcp-apps/mcp-apps/0.1.0"}],"uuid":"46cd9d33-2464-4b2a-a7f7-7df5c5381c34"}
{"type":"assistant","message":{"model":"claude-opus-4-5-20251101","id":"msg_011EKXLPCSoFY7QRpYvYjbz6","type":"message","role":"assistant","content":[{"type":"text","text":"I'll help you use Playwright to open https://example.com and report the title. Let me first load the Playwright tools."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":24091,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":24091},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"41e0b4f6-1e38-443e-803c-4359d1ecb808"}
{"type":"assistant","message":{"model":"claude-opus-4-5-20251101","id":"msg_011EKXLPCSoFY7QRpYvYjbz6","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01GGkD37iNP8kvZadcvzomBF","name":"ToolSearch","input":{"query":"playwright navigate","max_results":5},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":24091,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":24091},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"12213f8b-b1ca-43d5-b380-ec0ea760474f"}
{"type":"user","message":{"role":"user","content":[{"type":"tool_result","tool_use_id":"toolu_01GGkD37iNP8kvZadcvzomBF","content":[{"type":"tool_reference","tool_name":"mcp__playwright__browser_navigate"},{"type":"tool_reference","tool_name":"mcp__playwright__browser_navigate_back"},{"type":"tool_reference","tool_name":"mcp__playwright__browser_run_code_unsafe"},{"type":"tool_reference","tool_name":"mcp__playwright__browser_close"},{"type":"tool_reference","tool_name":"mcp__playwright__browser_resize"}]}]},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"5c3d4c59-dd8e-4245-8b0d-57f9c5f1b673","tool_use_result":{"matches":["mcp__playwright__browser_navigate","mcp__playwright__browser_navigate_back","mcp__playwright__browser_run_code_unsafe","mcp__playwright__browser_close","mcp__playwright__browser_resize"],"query":"playwright navigate","total_deferred_tools":130}}
{"type":"assistant","message":{"model":"claude-opus-4-5-20251101","id":"msg_01WcZ2tngKpD48vdA9wKjQ1Q","type":"message","role":"assistant","content":[{"type":"text","text":"Now let me navigate to the URL and get the page title."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":705,"cache_read_input_tokens":24091,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":705},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"e0f09d8a-6693-49a8-8fbc-03fdc9bab5be"}
{"type":"assistant","message":{"model":"claude-opus-4-5-20251101","id":"msg_01WcZ2tngKpD48vdA9wKjQ1Q","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Rj1rtRprGPfdxPYvTaxLoU","name":"mcp__playwright__browser_navigate","input":{"url":"https://example.com"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":705,"cache_read_input_tokens":24091,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":705},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"6d192fde-f370-4642-a672-c0b89fa01285"}
{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Rj1rtRprGPfdxPYvTaxLoU","type":"tool_result","content":[{"type":"text","text":"### Ran Playwright code\n```js\nawait page.goto('https://example.com');\n```\n### Page\n- Page URL: https://example.com/\n- Page Title: Example Domain\n### Snapshot\n- [Snapshot](.playwright-mcp/page-2026-06-18T16-01-18-493Z.yml)"}]}]},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"33a3ccfb-18d1-4d55-8a40-94b0808a1e27","tool_use_result":[{"type":"text","text":"### Ran Playwright code\n```js\nawait page.goto('https://example.com');\n```\n### Page\n- Page URL: https://example.com/\n- Page Title: Example Domain\n### Snapshot\n- [Snapshot](.playwright-mcp/page-2026-06-18T16-01-18-493Z.yml)"}]}
{"type":"assistant","message":{"model":"claude-opus-4-5-20251101","id":"msg_018XkHyhiGou6m3KSD38eS57","type":"message","role":"assistant","content":[{"type":"text","text":"The page title is **Example Domain**.\n\nThe Playwright browser successfully navigated to https://example.com and retrieved the title."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":167,"cache_read_input_tokens":24796,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":167},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","uuid":"ce06630d-ae05-47a6-aab7-f332bfe8ad30"}
{"type":"result","subtype":"success","is_error":false,"duration_ms":18951,"duration_api_ms":12312,"num_turns":3,"result":"The page title is **Example Domain**.\n\nThe Playwright browser successfully navigated to https://example.com and retrieved the title.","session_id":"04ccbc79-17bf-4766-94d6-00fab3c33d60","total_cost_usd":0.18620925000000002,"usage":{"input_tokens":5,"cache_creation_input_tokens":24963,"cache_read_input_tokens":48887,"output_tokens":208,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":24963,"ephemeral_5m_input_tokens":0}},"modelUsage":{"claude-haiku-4-5-20251001":{"inputTokens":387,"outputTokens":27,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.000522,"contextWindow":200000,"maxOutputTokens":64000},"claude-opus-4-5-20251101":{"inputTokens":5,"outputTokens":208,"cacheReadInputTokens":48887,"cacheCreationInputTokens":24963,"webSearchRequests":0,"costUSD":0.18568725000000003,"contextWindow":200000,"maxOutputTokens":64000}},"permission_denials":[],"uuid":"b742e80f-9231-4765-8696-00c9bef47987"}
PASS: MCP tool used: ToolSearch, mcp__playwright__browser_navigate
#!/usr/bin/env bash
set -euo pipefail
MCP_NAME="${MCP_NAME:-playwright}"
MCP_COMMAND="${MCP_COMMAND:-npx}"
MCP_ARGS_JSON="${MCP_ARGS_JSON:-[\"-y\",\"@playwright/mcp@latest\"]}"
EXPECTED_TOOL_PREFIX="${EXPECTED_TOOL_PREFIX:-mcp__${MCP_NAME}__}"
PROMPT="${1:-Use the playwright MCP server to open https://example.com and tell me the page title.}"
tmpdir="$(mktemp -d)"
trap 'rm -rf "$tmpdir"' EXIT
mcp_config="$tmpdir/mcp.json"
out="$tmpdir/claude-stream.jsonl"
cat > "$mcp_config" <<EOF
{
"mcpServers": {
"$MCP_NAME": {
"command": "$MCP_COMMAND",
"args": $MCP_ARGS_JSON
}
}
}
EOF
claude --mcp-config "$mcp_config" \
-p "$PROMPT" \
--output-format stream-json \
--verbose \
--allowedTools "${EXPECTED_TOOL_PREFIX}*" \
| tee "$out"
python3 - "$out" "$EXPECTED_TOOL_PREFIX" <<'PY'
import json, sys
path, expected_prefix = sys.argv[1], sys.argv[2]
tool_names = []
def walk(x):
if isinstance(x, dict):
name = x.get("name")
typ = x.get("type")
if isinstance(name, str) and (
name.startswith(expected_prefix)
or typ in ("tool_use", "server_tool_use")
):
tool_names.append(name)
for v in x.values():
walk(v)
elif isinstance(x, list):
for v in x:
walk(v)
with open(path, "r", encoding="utf-8") as f:
for line in f:
try:
walk(json.loads(line))
except json.JSONDecodeError:
pass
if not tool_names:
print(f"\nFAIL: no MCP tool use found matching prefix {expected_prefix!r}", file=sys.stderr)
sys.exit(1)
print(f"\nPASS: MCP tool used: {', '.join(sorted(set(tool_names)))}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment