Skip to main content
Glama
744,589 tools. Updated 2026-11-04 23:06

"How to test a React app" matching MCP tools:

  • Deploy a GitHub repository as a live web app on Dockhold. Call this when the user wants to put an app online, get a shareable HTTPS URL, or host a demo. Returns the new app id. Two paths: a PUBLIC repo needs only repo_url; a PRIVATE repo needs repo_url plus github_installation_id (call list_github_repos first, each repo comes with the installation_id to pass here). Deploying a private repo turns on auto-deploy: future pushes to that repo redeploy the app automatically. The app builds and comes online automatically; poll get_app_status to watch it. Set memory_mb to size the app's compute, one of the values get_resource_usage reports under compute.steps_mb: 256 MB fits a static site or a small API, 512 MB fits a typical Node or Python web app, and anything that holds data in memory needs more. Omit it and the app gets the minimum slice (256 MB) so it doesn't take your whole compute pool; resize_app changes the size later with no rebuild, applied as a rolling update that replaces the app's instances. The response reports memory_mb (what this app got) and compute_available_mb (what's left in your pool), so size the next app off that. This tool needs a GitHub repo URL: if the code only exists locally (no repo), it cannot be used here, and the user should run `npx dockhold login` then `npx dockhold deploy` in the project folder instead. Requires a token with the deploy scope.
    ConnectorNo auth
  • Return a ready-to-paste snippet that wraps the Next.js root layout with `<UploadKitProvider>` so React components can talk to the upload route handler. When to use: right after scaffold_route_handler, to complete the wiring. The snippet goes in `app/layout.tsx`. Without the provider, UploadKit React components throw at runtime. Returns: a plain-text string containing a short explanatory note followed by a fenced tsx code block. Takes no parameters — the endpoint path is always `/api/uploadkit` since that is what scaffold_route_handler produces. Read-only, deterministic, idempotent.
    ConnectorNo auth
  • Public (no auth): describe what Cabgo is. Returns the full product catalog — what kinds of apps an operator can launch, pricing, who Cabgo is for, and how to onboard. Use ONLY when the user explicitly asks what Cabgo is, what it does, or wants an overview. **Do NOT call this as a pre-step before cabgo_create_my_app** — when the user wants to create / launch an app, go directly to cabgo_create_my_app without fetching context first.
    ConnectorNo auth
  • Generate Jest/Vitest tests for the exported functions and React components in a TypeScript source file. Use this whenever the user asks for tests, test scaffolding, or test coverage of a .ts or .tsx file. Returns the generated test (and any companion .3tg.md / __mocks__) file contents, with paths already translated to the user's `.3tg/` mirror convention. Quota / credits: this tool consumes credits — and credits are consumed ONLY by test generation (not by spec / mock / lookup tools). The accounting is exactly **1 credit per generated test case** (i.e. per `test(...)` / `it(...)` block 3TG emits inside the returned `.test.ts` / `.test.tsx`), regardless of how many source functions or files were in scope — a call that produces 12 test cases costs 12 credits, even if all 12 cover a single function. Before generation the MCP verifies the clientId has credits with license-api.coding-creed.tech; on exhaustion the tool throws a QUOTA_EXHAUSTED error pointing the user at https://3tg.dev. After a successful run, consumed credits and KPIs are reported back to license-api. Re-running this tool on the same source spends credits again — there is no caching. When the previous call returned `enrichment.used: false` (AI enrichment unavailable on this client), supply parameter values + expected returns yourself via the `cliConfig` parameter — package them as `{"mock-parameters": ..., "function-returns": ...}` (same shape AI enrichment would produce) and pass them on a retry call. **Do NOT autonomously write `.3tg/config.3tg.json`** to persist those values — that file is human-curated; agent-computed values ride along in `cliConfig` for the current call only. (Explicit user requests to edit the file are fine — handle those normally.) See the cliConfig parameter description below for the full pattern. CRITICAL POST-CALL ACTION — write returned files to disk: The MCP server does NOT touch the user's filesystem. It returns the generated file CONTENTS in the response's `files` array. After this tool returns, you MUST iterate over `files` and write each entry's `content` verbatim to its `path` using your native file-write capability (e.g. Write / edit_file / create_file — whatever your client exposes). Create parent directories as needed. Returned paths are project-root-relative and already translated to the `.3tg/` mirror convention where applicable (e.g. specs land under `.3tg/<source-path>.3tg.md`; tests / mocks travel through unchanged). Write each path verbatim. Do NOT claim "Generated test file: <path>" unless you have actually written the file. The user will assume the MCP wrote it and waste time looking for a non-existent file. If you can't write for some reason (permission denied, no write capability in this client), return the contents inline in your message so the user can copy-paste them. Never report success silently when the write didn't happen.
    ConnectorNo auth
  • How many jobs mentioning a skill were posted recently, and whether that is rising or falling week by week. Use it to decide whether a skill is worth positioning around, or to check a hunch that a market is drying up. `skill` matches the title, the skills list and the inferred technical skills of a posting; it is a loose match, so "react" also counts "React Native". `window` is one of "week", "month" or "quarter" and sets both the total and how many weekly buckets come back — any other value is refused rather than silently defaulted. Returns `jobs_posted` for the whole window and `weekly`, a list of buckets oldest first, so a trend is visible without a second call. DO NOT COMPARE THE BUCKET COUNTS DIRECTLY. Weeks are cut on Mondays and the window is not, so the newest bucket holds only the days elapsed so far and the oldest holds only the tail of the week the window opened in. Both are low for a calendar reason and no other, which reads as a rise and a fall that did not happen. Every bucket therefore carries `days_covered`, `partial`, and `per_day` — the per-day rate is the comparable number. `trend` is computed from complete weeks only; prefer it, and if you quote a bucket marked `partial`, say that it is. `trend.direction` is 'rising', 'falling', 'flat', or 'unknown' when there are fewer than two complete weeks — 'unknown' means the window is too short to judge, not that demand is flat. A COUNT over public postings — no rows, no buyers, no ids, nothing that identifies a client. It answers how much, not who. And it counts POSTINGS, not hiring: a skill can be posted about constantly by clients who never hire. For whether a specific client hires and pays, ask get_buyer_quality.
    ConnectorOAuth
  • How many jobs mentioning a skill were posted recently, and whether that is rising or falling week by week. Use it to decide whether a skill is worth positioning around, or to check a hunch that a market is drying up. `skill` matches the title, the skills list and the inferred technical skills of a posting; it is a loose match, so "react" also counts "React Native". `window` is one of "week", "month" or "quarter" and sets both the total and how many weekly buckets come back — any other value is refused rather than silently defaulted. Returns `jobs_posted` for the whole window and `weekly`, a list of buckets oldest first, so a trend is visible without a second call. DO NOT COMPARE THE BUCKET COUNTS DIRECTLY. Weeks are cut on Mondays and the window is not, so the newest bucket holds only the days elapsed so far and the oldest holds only the tail of the week the window opened in. Both are low for a calendar reason and no other, which reads as a rise and a fall that did not happen. Every bucket therefore carries `days_covered`, `partial`, and `per_day` — the per-day rate is the comparable number. `trend` is computed from complete weeks only; prefer it, and if you quote a bucket marked `partial`, say that it is. `trend.direction` is 'rising', 'falling', 'flat', or 'unknown' when there are fewer than two complete weeks — 'unknown' means the window is too short to judge, not that demand is flat. A COUNT over public postings — no rows, no buyers, no ids, nothing that identifies a client. It answers how much, not who. And it counts POSTINGS, not hiring: a skill can be posted about constantly by clients who never hire. For whether a specific client hires and pays, ask get_buyer_quality.
    ConnectorOAuth

Matching MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    面向 Codex、WorkBuddy 等 AI 工具的知你AI助手合并版 Skills,涵盖当前会话分诊、客户查询与画像、历史会话检索、客户分群和 API Key 用量查询,并连接个微、企微、视频号、微信小程序、公众号、服务号、微信客服、微信小店、抖音号、小红书、微博、网站及H5客服等渠道。
    MIT No Attribution
  • A
    license
    Not graded
    quality
    A
    maintenance
    . A good description should be concise and describe what the server enables users to do, e.g. * Enables to interact with WordPress sites...' Then a huge block? Actually the user message includes the README content inside tags, then after the readme, there is a large block of text starting with '{
    7,061 npm
    MIT

Matching MCP Connectors

  • Create a complete Google App campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), location + language targeting, an ad group, and the app ad. App campaigns promote a mobile app across Google Search, Google Play, YouTube, Discover and the Display Network — Google mixes the ad from your text (and optional media) automatically. The ad links to the app's store listing AUTOMATICALLY: there is no URL input, ever. Any PUBLIC store app id works (no app ownership or Play/Firebase link is required to create): Android app_id is the package name (e.g. com.example.app), iOS app_id is the numeric App Store id (e.g. 570060128) with app_store 'apple_app_store'. v1 optimizes INSTALLS at your target_cpi (target cost per install, plain number in the account currency); Google recommends a daily_budget of roughly 50x target_cpi — lower is allowed but slows learning (a warning says so). Text: 2-5 headlines (max 30 chars) + 1-5 descriptions (max 90). Optional media: image_asset_ids / video_asset_ids from adsap_google_upload_asset (images 1.91:1, 4:5 or 1:1 up to 5MB; videos are YouTube assets 10-60s) — text-only is fully valid. In-app-action, value, engagement and pre-registration goals are NOT supported in v1. If the account has no conversion tracking a warning is returned — relay it (Android installs normally auto-track once a Google Play link exists). Use dry_run: true first — Google validates the whole chain without creating anything; show the plan, get confirmation, then execute. ad_account_id is the bare 10-digit customer ID. For website campaigns use adsap_google_create_search_campaign / adsap_google_create_pmax_campaign; for Meta app ads use adsap_create_campaign with an app objective.
    ConnectorAPI key
  • Set the session token lifetimes on the Bridge app: accessTokenTTL and refreshTokenTTL, both in SECONDS. Only the fields you pass are changed. IMPORTANT — despite the name (kept for parity with `bridge auth password-policy`), this sets token TTLs and NOTHING about passwords: Bridge exposes no password-complexity, rotation or reuse policy on the management API, so if the user asked for password rules, say so instead of calling this. The access token TTL controls how often a client silently refreshes (short is safer, e.g. 900 = 15 minutes); the refresh token TTL controls how long a user stays logged in without re-authenticating (e.g. 2592000 = 30 days). Read the current values with get_auth_config. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
    ConnectorOAuth
  • Show your account's compute, database-RAM, and storage pools: how much you've bought, how much is used, and how much is free, plus every app's current size. Call this before any resize tool (the allowed sizes come from its steps fields), and to explain to the user why an app ran out of memory or a deploy was refused for capacity.
    ConnectorNo auth
  • Side effect when confirmSend is true: sends one current draft email or Slack message for review, but does not publish, schedule, or edit the workflow. Use after authoring or inspection when the user wants to verify an important message before publishing. Returns sent-test details, app URLs, a confirmation request, or a clarification request with user-facing message choices. If the test has no data because row level security hides a source table's rows from Dreamlit, returns error code table_rows_hidden_by_rls with unreadableTables[].fixSql to run, or ask the user to run, in the Supabase SQL editor. Do not expose test target ids as copy; ask users to choose by message label and confirm before sending.
    ConnectorNo auth
  • Returns instructions for migrating to PropelAuth in a frontend framework such as React, JavaScript, TypeScript, or when using Next.js for just the frontend (e.g. client-side rendered). Guidance includes migrating from several auth providers, such as Clerk or Auth0. Each guidance will include documentation from the auth provider and PropelAuth. It is important to follow the instructions carefully to ensure a successful integration. Make sure to use the 'Installation' guidance first. It is important to call every guidance to ensure a successful integration. Do not update a component/hook/etc from the auth provider until you receive guidance about that component/hook/etc. CRITICAL: If the current implementation uses a traditional OAuth/OIDC flow (e.g., via express-openid-connect, passport-auth0, or similar backend-managed session libraries), you MUST select 'OAuth' as the framework, regardless of the frontend library (React/Vue/etc.). Only select 'React' or 'Javascript' if the current implementation uses a frontend-only SDK (like @auth0/auth0-react) or if using fullstack Next.js.
    ConnectorNo auth
  • Return the persisted markers + AI analysis (Summary, KeyFindings, Recommendations, DetailedExplanation) for a specific medical-test the authenticated patient owns. Use after mediora__get_patient_history surfaces a test id the user wants to discuss. Bearer token must be a Mediora patient-scope JWT. Proxies https://api.mediora.ai/api/medical-tests/{id} with the user's token forwarded as Authorization: Bearer.
    ConnectorNo auth
  • Compile a hand-edited functional-requirements spec (`.3tg.md`) into actual Jest/Vitest tests. This is "Flow B" — the user has already authored or reviewed the `.3tg.md` and is ready to materialise the rows into a runnable test file. Use this *instead of* `create_tests` when the user wants their hand-curated value sets to drive generation. Inputs: the source code plus the spec content (the spec lives at `.3tg/<sourceDir>/<basename>.3tg.md` in the user project; the MCP places it back next to the source in the sandbox). AI enrichment is NOT run — the spec is authoritative. 3TG also writes a `<basename>.md.3tg.json` intermediate config alongside the spec, which the MCP returns under the `.3tg/` mirror so the user can inspect what the spec compiled to. Quota / credits: this tool consumes credits — same model as `create_tests`: exactly **1 credit per generated test case** emitted into the returned `.test.ts` / `.test.tsx`. The number of rows in your `.3tg.md` table is therefore a reliable upper bound on what the call will cost. Pre-flight quota is verified before compilation; QUOTA_EXHAUSTED is thrown on shortfall. **Flow B cliConfig caveat — spec-authoritative keys are STRIPPED.** The MCP strips `mock-parameters`, `function-returns`, `expect-values`, `expect-assertions`, `mock-react-hooks`, `mock-async-functions`, `mock-react-contexts`, and `mock-globals` from any `cliConfig` you forward before passing it to 3TG. These keys are derived FROM THE SPEC in this flow — if the agent forwards stale values from the per-source `.md.3tg.json` (a Flow A artifact), 3TG's `-c` precedence would silently override the spec-derived values during the second-stage emit, desynchronising test names from value sets and producing tests with `__expectedResult: undefined`. For Flow B, forward ONLY global/structural config keys (`rules.*`, `creationMode`, `mockAsFunction`, `no-rule-default-true`, `ignore`, `package.json.type`, …) — the spec owns the test-value plan. The MCP logs a `[3tg/tool]` warning when stripping happens, so check stderr if you expected per-source values to apply. CRITICAL POST-CALL ACTION — write returned files to disk: The MCP server does NOT touch the user's filesystem. It returns the generated file CONTENTS in the response's `files` array. After this tool returns, you MUST iterate over `files` and write each entry's `content` verbatim to its `path` using your native file-write capability (e.g. Write / edit_file / create_file — whatever your client exposes). Create parent directories as needed. Returned paths are project-root-relative and already translated to the `.3tg/` mirror convention where applicable (e.g. specs land under `.3tg/<source-path>.3tg.md`; tests / mocks travel through unchanged). Write each path verbatim. Do NOT claim "Generated test file: <path>" unless you have actually written the file. The user will assume the MCP wrote it and waste time looking for a non-existent file. If you can't write for some reason (permission denied, no write capability in this client), return the contents inline in your message so the user can copy-paste them. Never report success silently when the write didn't happen.
    ConnectorNo auth
  • Raw log lines — for when the `diagnose_deploy` analysis was not enough. Start with `diagnose_deploy`: it has already pulled out the cause and the neighbourhood of the fatal line. Come here when you need to look with your own eyes — the cause is vague, or you are interested in how the app behaves rather than in a failure. You get the TAIL. `truncated` says earlier lines were dropped; do not present the tail as the whole log. For build logs, package-manager network chatter is hidden BEFORE the tail is cut, so the tail holds meaningful lines; `noise_hidden` says how many were hidden and `include_noise=true` shows them.
    ConnectorOAuth
  • Raw log lines — for when the `diagnose_deploy` analysis was not enough. Start with `diagnose_deploy`: it has already pulled out the cause and the neighbourhood of the fatal line. Come here when you need to look with your own eyes — the cause is vague, or you are interested in how the app behaves rather than in a failure. You get the TAIL. `truncated` says earlier lines were dropped; do not present the tail as the whole log. For build logs, package-manager network chatter is hidden BEFORE the tail is cut, so the tail holds meaningful lines; `noise_hidden` says how many were hidden and `include_noise=true` shows them.
    ConnectorAPI key
  • Store a sensitive value (an API key, a token, a password, a connection string) for one app. Use this instead of set_app_variable whenever the value would be damaging if someone else read it. The value is encrypted at rest, is injected into the app's environment under the name you give, and the app restarts to pick it up. Storing a secret takes effect on the next boot, so call this before telling the user the app is ready. This tool never reads a value back: there is no way to retrieve a stored secret through this connection, only through the dashboard while signed in. Two things to tell the user before you call it. First, this token can write secrets to every app on their account, not only this one. Second, any value they give you has passed through your context, so prefer a value you read from a local file such as .env over one you asked them to type into the chat, and suggest they rotate anything that was pasted. If the vault key name is already used by a different app, this call is refused rather than overwriting it, and the message tells you what to pass as vault_key_name.
    ConnectorNo auth
  • Look up customer-facing Wellness Project product knowledge. Use it for app navigation, visible features, integrations, metric meanings, logging methods, permissions/sync questions, or troubleshooting. Wellness Project-specific answers are closed-book: answer them from this tool's result, never from memory. The result states its own grounding rules. For how-to questions, select the relevant feature topic; a matching published video link is included when one exists. For a request to find, report through, or open the feedback form, use topic=troubleshooting. In-app chat must offer the open_feedback action chip, not print the link (chat links render as plain text). External MCP clients may provide the exact Share feedback link returned. Never claim the form was opened without the user tapping the action. For recognized exercise names or whether an exercise is in the app's exercise library, use list_exercises rather than guessing or expecting the app guide to enumerate exercises. For cost, price, Free vs Pro, Founding Member, upgrading, or the 3-analysis limit, use topic=pricing. Reproduce exactly one returned pricing message verbatim, including its subscription link when it has one, and add no other pricing detail. The app attaches its own upgrade button to that message when one applies; never type out a button, chip, link markup, or call-to-action of your own.
    ConnectorOAuth
  • Replace the notes on a finished Load Test's Test Report — the only thing on a Load Test this surface edits. Ask the user before writing: notes belong to the user, and advising on a test never requires writing them. The text sent becomes the report's entire notes, so first read the current notes with get_load_test_report and preserve the user's content in what you send.
    Connector
    Destructive
    OAuth
  • Write WHOLE files DIRECTLY — YOUR model generates the code, Kleap stores, builds and deploys it as-is. To change something in a file that ALREADY EXISTS, use edit_files instead (read_files → edit_files): it replaces just the lines you name, while write_files makes you retype the entire file and silently drops whatever you leave out — on a 30KB shared layout that is how headers and footers get wiped. No Kleap-AI step, so what ships is byte-for-byte what you wrote — the right choice when a phrase, a URL or a schema must be exact. Publishing still audits the result (see publish_app). Best for scaffolding exact pages/components — e.g. programmatic-SEO routes. Astro paths (src/pages/*.astro, src/data/*.json, src/components/*.astro, public/*). Overwrites by path. NPM PACKAGES: do not write package.json (the build replaces it) — the build installs whatever your code IMPORTS, so `import { jsPDF } from "jspdf";` is all it takes. Supported on import: @tiptap/*, jspdf, pdf-lib, html2canvas, papaparse, file-saver, jszip, @ffmpeg/*, howler, wavesurfer.js, browser-image-compression, react-dropzone, recharts, chart.js, d3, @tanstack/*, react-hook-form, three, @react-three/*, leaflet, maplibre-gl, gsap, framer-motion, zustand, date-fns, react-markdown, axios, socket.io-client, radix-ui/*, next-themes, lucide-react, @tabler/*, openai, @ai-sdk/*; anything else is refused at build with a message naming it. A client-side router is never the answer — a route is a FILE (src/pages/about.astro → /about). IMAGES AND BINARIES: set encoding:"base64" on the file and send the bytes — that is how you put a logo, a photo, an OG image, a favicon or a font on the site (png/jpg/webp/svg/ico/mp4/woff2/pdf, 512KB max each decoded). Without it you can only write text, and a site with no images looks unfinished. To ADD an image from a text prompt WITHOUT sending any bytes (a real photo's base64 is too big to emit reliably), use generate_image — Kleap generates it and stores it for you. To REMOVE a page or asset, use delete_files — overwriting it with empty content leaves a URL that answers 200 with nothing, which is worse than a 404. DATA & ACCOUNTS: write_files only STORES files — it cannot provision the Kleap Database, so DB or auth code pushed here has no backend and silently does nothing. Stand the feature up with modify_app first, then edit those pages here. After writing, call publish_app to build & go live.
    Connector
    Destructive
    OAuth
  • Write WHOLE files DIRECTLY — YOUR model generates the code, Kleap stores, builds and deploys it as-is. To change something in a file that ALREADY EXISTS, use edit_files instead (read_files → edit_files): it replaces just the lines you name, while write_files makes you retype the entire file and silently drops whatever you leave out — on a 30KB shared layout that is how headers and footers get wiped. No Kleap-AI step, so what ships is byte-for-byte what you wrote — the right choice when a phrase, a URL or a schema must be exact. Publishing still audits the result (see publish_app). Best for scaffolding exact pages/components — e.g. programmatic-SEO routes. Astro paths (src/pages/*.astro, src/data/*.json, src/components/*.astro, public/*). Overwrites by path. NPM PACKAGES: do not write package.json (the build replaces it) — the build installs whatever your code IMPORTS, so `import { jsPDF } from "jspdf";` is all it takes. Supported on import: @tiptap/*, jspdf, pdf-lib, html2canvas, papaparse, file-saver, jszip, @ffmpeg/*, howler, wavesurfer.js, browser-image-compression, react-dropzone, recharts, chart.js, d3, @tanstack/*, react-hook-form, three, @react-three/*, leaflet, maplibre-gl, gsap, framer-motion, zustand, date-fns, react-markdown, axios, socket.io-client, radix-ui/*, next-themes, lucide-react, @tabler/*, openai, @ai-sdk/*; anything else is refused at build with a message naming it. A client-side router is never the answer — a route is a FILE (src/pages/about.astro → /about). IMAGES AND BINARIES: set encoding:"base64" on the file and send the bytes — that is how you put a logo, a photo, an OG image, a favicon or a font on the site (png/jpg/webp/svg/ico/mp4/woff2/pdf, 512KB max each decoded). Without it you can only write text, and a site with no images looks unfinished. To ADD an image from a text prompt WITHOUT sending any bytes (a real photo's base64 is too big to emit reliably), use generate_image — Kleap generates it and stores it for you. To REMOVE a page or asset, use delete_files — overwriting it with empty content leaves a URL that answers 200 with nothing, which is worse than a 404. DATA & ACCOUNTS: write_files only STORES files — it cannot provision the Kleap Database, so DB or auth code pushed here has no backend and silently does nothing. Stand the feature up with modify_app first, then edit those pages here. After writing, call publish_app to build & go live.
    Connector
    Destructive
    No auth
  • Compute an IRR sensitivity grid across a range of exit multiples and hold periods for a single lump-sum investment. WHEN TO USE: to stress-test how the annualised return varies with exit multiple and holding period before committing to an investment. Complements calculate_irr. WHEN NOT TO USE: when you need one precise IRR for a known exit value (use calculate_irr), or a full valuation (use calculate_dcf). BEHAVIOUR: pure deterministic calculation — no side effects, no network or storage access; idempotent and non-destructive. NOTE ON GRID GEOMETRY: the byMultiple grid is computed at the SECOND hold period in hold_periods (default 5 years); the byHoldPeriod grid is computed at a 2.5x exit multiple. RETURNS: JSON object { byMultiple: { "2.0x": 14.9, ... } with IRR values as percentage numbers rounded to 1dp, byHoldPeriod: { "5y": 18.4, ... } }. PARAMETERS: initial_investment (number > 0), exit_multiples (optional array of numbers to test, default [1.5, 2.0, 2.5, 3.0, 3.5]), hold_periods (optional array of positive integers (years) to test, default [3, 5, 7, 10]).
    ConnectorNo auth