Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Tidewave MCP runtime tools — debugging, smoke testing, live state inspection, SQL queries, hex docs. Use when evaluating code in a running Phoenix app.
.claude/skills/oliver-kriska-tidewave-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 149% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 229% | 0% |
Runtime intelligence for Phoenix apps via MCP. Prefer Tidewave tools over Bash when available.
mcp__tidewave__get_docs > web_fetch, execute_sql_query > psql/mcp command or detect mcp__tidewave__ toolsexecute_sql_query for SELECT, be careful with mutationsget_docs returns docs for YOUR mix.lock versions, not latest| Task | Tidewave Tool | Fallback | |------|---------------|----------| | Get docs | mcp__tidewave__get_docs Module.func/3 | web_fetch hexdocs.pm/... | | Run code | mcp__tidewave__project_eval | mix run -e "code" | | SQL query | mcp__tidewave__execute_sql_query | psql $DATABASE_URL | | Find source | mcp__tidewave__get_source_location | grep -rn "defmodule" | | Inspect DOM | mcp__Tidewave-Web__browser_eval | Manual browser inspection | | List schemas | mcp__tidewave__get_ecto_schemas | Read lib/*/schemas/ | | Read logs | mcp__tidewave__get_logs level: :error | tail -f log/dev.log |
bash# Check endpoint curl -s http://localhost:4000/tidewave/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"ping"}'
Or use /mcp in Claude Code to see connected servers.
elixir# mcp__tidewave__project_eval MyApp.Accounts.create_user(%{email: "test@example.com"})
sql-- mcp__tidewave__execute_sql_query SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'users';
elixir# mcp__tidewave__project_eval pid = pid("0.1234.0") :sys.get_state(pid) |> Map.get(:socket) |> Map.get(:assigns) |> Map.keys()
elixir# mix.exs {:tidewave, "~> 0.6", only: :dev} # endpoint.ex (in dev block) plug Tidewave # config/dev.exs (for LiveView source mapping) config :phoenix_live_view, debug_heex_annotations: true, debug_attributes: true
The dependency and endpoint plug expose Tidewave's streamable HTTP server; they do not register it with an MCP client. Configure the current runtime separately with http://localhost:<port>/tidewave/mcp, then verify that Tidewave tools are available before relying on this skill.
Worktree/port check (FIRST, in multi-worktree setups): multiple worktrees = multiple dev servers on different ports. Before trusting any Tidewave result, confirm the endpoint belongs to THIS checkout: grep config/dev.exs for the configured port, and verify with project_eval File.cwd!() — if it returns a different worktree path, you're debugging the wrong server.
Schema introspection BEFORE SQL: never guess column names. Run get_ecto_schemas (or query information_schema.columns) before writing SQL against a table you haven't already introspected this session. A guessed-column error costs more than the introspection.
Output-size guard: runtime output is unbounded. Always cap it — LIMIT 20 in SQL, Enum.take(20) in evals, inspect(x, limit: 50, printable_limit: 500) for large structs. Re-query narrower rather than dumping wide.
browser_eval fallback: if mcp__Tidewave-Web__browser_eval is absent or errors, don't stall — inspect the same state server-side: LiveView assigns via :sys.get_state(pid) in project_eval, rendered HTML via Phoenix.LiveViewTest, or read the template source directly.
QA walkthrough pattern: after a feature completes, run a short checklist through project_eval/browser_eval: create the record, fetch it back, exercise the main event, check get_logs level: :error is clean. Report each step's pass/fail — not just "smoke test passed".
Don't just use Tidewave reactively. Query runtime state at workflow checkpoints automatically:
get_logs level: :error (catch runtime crashes)project_eval smoke test (behavioral check)get_ecto_schemas + routes eval (concrete context)browser_eval to inspect DOM state before editing componentsSee references/proactive-patterns.md for full integration points.
For detailed patterns, see:
references/proactive-patterns.md - Push-like runtime patterns at workflow checkpointsreferences/tool-examples.md - Complete tool usage examplesreferences/validation-checklist.md - Runtime validation patterns| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 16,944 | 6,355 | -62% | 1 | 1 | 0% | 1,431 | 2,223 | +55% | 0 | 0 | — |
case-01 | fail→fail | 5,484 | 10,799 | +97% | 1 | 1 | 0% | 890 | 2,163 | +143% | 0 | 0 | — |
case-02 | fail→fail | 10,197 | 10,182 | -0% | 1 | 1 | 0% | 1,779 | 2,199 | +24% | 0 | 0 | — |
case-03 | fail→fail | 10,177 | 8,673 | -15% | 1 | 1 | 0% | 1,825 | 2,305 | +26% | 0 | 0 | — |
case-04 | fail→pass | 5,958 | 5,010 | -16% | 1 | 1 | 0% | 934 | 2,321 | +149% | 0 | 0 | — |
case-06 | fail→pass | 14,053 | 5,316 | -62% | 1 | 1 | 0% | 2,335 | 2,341 | +0% | 0 | 0 | — |
case-07 | fail→fail | 9,833 | 4,971 | -49% | 1 | 1 | 0% | 1,803 | 2,277 | +26% | 0 | 0 | — |
case-08 | fail→pass | 13,445 | 8,927 | -34% | 1 | 1 | 0% | 2,206 | 3,020 | +37% | 0 | 0 | — |
case-09 | fail→pass | 3,778 | 3,319 | -12% | 1 | 1 | 0% | 587 | 1,931 | +229% | 0 | 0 | — |
case-14 | pass→pass | 8,017 | 2,365 | -71% | 1 | 1 | 0% | 1,321 | 1,751 | +33% | 0 | 0 | — |
case-10 | fail→pass | 18,302 | 8,864 | -52% | 1 | 1 | 0% | 2,860 | 2,929 | +2% | 0 | 0 | — |
case-11 | fail→pass | 9,238 | 2,901 | -69% | 1 | 1 | 0% | 1,701 | 1,886 | +11% | 0 | 0 | — |
case-12 | pass→pass | 6,588 | 2,996 | -55% | 1 | 1 | 0% | 1,115 | 1,915 | +72% | 0 | 0 | — |
case-13 | fail→fail | 8,180 | 5,884 | -28% | 1 | 1 | 0% | 1,350 | 2,432 | +80% | 0 | 0 | — |
case-15 | fail→pass | 8,379 | 5,726 | -32% | 1 | 1 | 0% | 1,342 | 2,332 | +74% | 0 | 0 | — |
case-16 | fail→pass | 9,971 | 4,872 | -51% | 1 | 1 | 0% | 1,693 | 2,234 | +32% | 0 | 0 | — |
case-17 | fail→fail | 7,430 | 2,403 | -68% | 1 | 1 | 0% | 1,208 | 1,793 | +48% | 0 | 0 | — |
case-18 | pass→pass | 8,314 | 3,190 | -62% | 1 | 1 | 0% | 1,785 | 2,012 | +13% | 0 | 0 | — |
case-19 | fail→pass | 6,294 | 4,678 | -26% | 1 | 1 | 0% | 1,155 | 2,247 | +95% | 0 | 0 | — |
case-20 | pass→pass | 14,751 | 12,588 | -15% | 1 | 1 | 0% | 2,884 | 2,871 | -0% | 0 | 0 | — |
case-21 | pass→pass | 17,040 | 12,180 | -29% | 1 | 1 | 0% | 2,966 | 3,593 | +21% | 0 | 0 | — |
case-22 | pass→pass | 5,128 | 7,806 | +52% | 1 | 1 | 0% | 919 | 2,155 | +134% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.