MewCP LogoAStheTech
MCPs
Use Cases

Use cases by category

Productivity & InboxInbox, calendar, and daily flowEngineering & DevOpsShip, debug, and run on-callSales & CRMPipeline, outreach, and dealsMarketing & GrowthCampaigns, SEO, and growthSupport & SuccessTriage tickets, keep customers happyFinance & OpsClose, reconcile, and expensesCreative & ContentGenerate assets and contentPeople & HiringHiring, onboarding, and HRResearch & DataSynthesize data and insights
See all use cases
Resources
BlogsProduct updates and storiesArticlesIntegration guides and code examples
PricingDocsSign in
Back to home
MewCP Logo

Infrastructure You Can Trust for Agentic Products

X

Categories

  • Productivity & Docs
  • Developer Tools
  • CRM & Sales
  • Finance & Commerce
  • Data & Analytics
  • Marketing & SEO
  • Search & Web
  • Communication
  • View All Servers →

Resources

  • Blog
  • Docs
  • Privacy Policy
  • Terms of Service

Blogs

  • View All Blogs →

Articles

  • View All Articles →
Browse Servers|Pricing|Contact

Browse by Category

Productivity & Docs

  • Gmail
  • Google Drive
  • YouTube
  • Google Calendar
  • Google People
  • Google Classroom
  • Notion
  • ClickUp
  • Figma
  • Google Tasks
  • Cal
  • Monday
  • Luma
  • Notion MCP
  • Mem MCP
  • Linear MCP
  • Calendly MCP
  • Consensus MCP
  • Craft MCP
  • Close MCP
+ 23 more
  • Dice MCP
  • Lumin PDF MCP
  • Develop21 MCP
  • Granola MCP
  • Lucid MCP
  • Mermaid Chart MCP
  • Fireflies MCP
  • ClickUp MCP
  • Miro MCP
  • Llamaindex MCP
  • Otter MCP
  • Mobbin MCP
  • Descript MCP
  • ToDoist MCP
  • SlidesGPT MCP
  • AgileHero MCP
  • JobYap MCP
  • AccountHub MCP
  • Slicktrip MCP
  • Gemina MCP
  • QrVerloz
  • Tempreon MCP
  • HyperFrames MCP

Developer Tools

  • Gemini
  • Veo
  • ClickUp
  • Firecrawl
  • Vercel
  • Apify
  • Github
  • Chef
  • Scientific Calculator
  • Figma
  • HTTP
  • Perplexity
  • Apify MCP
  • Hugging Face Hub MCP
  • Buildkite MCP
  • Cloudflare MCP
  • Context7 MCP
  • Ahrefs MCP
  • Sentry MCP
  • Brevo Docs MCP
+ 54 more
  • X Docs MCP
  • Jev
  • Linear MCP
  • Calendly MCP
  • Craft MCP
  • DeepWiki MCP
  • Inspo MCP
  • Kernel MCP
  • Malwarebytes MCP
  • Mermaid Chart MCP
  • Supabase MCP
  • Microsoft Learn MCP
  • Webflow MCP
  • Scalar Docs MCP
  • Oneuptime MCP
  • Redocly MCP
  • Reducto Docs MCP
  • Llamaindex Docs MCP
  • B12 MCP
  • Lucid Docs MCP
  • Airwallex Docs MCP
  • Langfuse Docs MCP
  • Glen Docs MCP
  • AgentMail
  • Gogs Docs MCP
  • Netlify MCP
  • Neon MCP
  • Minlify Admin MCP
  • Mintlify Index MCP
  • Fern Docs MCP
  • Greptile MCP
  • Statssif Docs MCP
  • Scorecard MCP
  • Railway MCP
  • Inkbox AI
  • Stele MCP
  • LastPing MCP
  • ConsentStack
  • Iubenda MCP
  • BSV.CX MCP
  • Agent Traffic Lab MCP
  • Nippy MCP
  • Just Domain MCP
  • Grafana Cloud MCP
  • HotAPI Docs
  • Endoflife.ai MCP
  • ElevenLabs MCP
  • Laso Docs MCP
  • OpenRouter MCP
  • Replit MCP
  • Tripadvisor Docs MCP
  • GitLab MCP
  • Mailchimp Docs MCP
  • Clerk MCP

CRM & Sales

  • Google People
  • OneSignal MCP
  • Brevo Docs MCP
  • Brevo
  • Brevo MCP
  • Carbon Voice MCP
  • Clay MCP
  • Close MCP
  • Attio MCP
  • Clarify MCP
  • Hunter.io
  • Plain MCP
  • Modem MCP
  • Whats MCP

Finance & Commerce

  • Kite
  • Razorpay
  • Polymarket
  • Stripe
  • Binance
  • Upstox
  • Aiwyn MCP
  • Era-Context-MCP
  • Granted MCP
  • XDC AI MCP
  • Agentery MCP
  • Agent Embassy
  • Quick Commerce MCP
  • Longbridge MCP
  • Mercury MCP
  • Blockscout MCP
  • Octagon AI MCP
  • Stripe MCP
  • Taskrabbit MCP
  • SeatGeek MCP
+ 16 more
  • Clarity AI MCP
  • Beyond Payday MCP
  • DeFade MCP
  • MobileMRR MCP
  • SecondAppraisal MCP
  • Brek MCP
  • Coinversa Pulse MCp
  • Supermetrics Marketing Analytics MCP
  • DeepLedger MCP
  • Laso MCP
  • Laso Docs MCP
  • Razorpay MCP
  • Kiwi MCP
  • lastminute mcp
  • Coinfuty MCP
  • Pyth MCP

Data & Analytics

  • Apify MCP
  • Cloudflare MCP
  • Ahrefs MCP
  • Candid MCP
  • Consensus MCP
  • Contentsquare MCP
  • Era-Context-MCP
  • Instinct MCP
  • legal Data Hunter MCP
  • Marcopolo MCP
  • Mixpanel MCP
  • MOSPI MCP
  • Hex MCP
  • OpenRevenue MCP
  • Statsig MCP
  • Synthesize Bio MCP
  • PostHog MCP
  • PopHIVE MCP
  • Fuse Health MCP
  • Cliometry MCP
+ 5 more
  • AccuWeather MCP
  • ChEMBL MCP
  • ClinicalTrials.gov MCP
  • Staats MCP
  • NPI Registry MCP

Marketing & SEO

  • YouTube
  • Google Business
  • Mailchimp
  • Google Search Console
  • OneSignal MCP
  • Cloudflare MCP
  • Brevo Docs MCP
  • Brevo
  • Brevo MCP
  • AirOps MCP
  • Clay MCP
  • Contentsquare MCP
  • Reelsmith MCP
  • GoDaddy MCP
  • Metricool MCP
  • Webflow MCP
  • Windsor MCP
  • Commonroom MCP
  • B12 MCP
  • Hunter.io
+ 14 more
  • Get MCP Ads
  • Minlify Admin MCP
  • Zernio MCP
  • Affiliatespy MCP
  • VarynForge
  • ListingGood MCP
  • North Noir MCP
  • Supermetrics Marketing Analytics MCP
  • NitroSend MCP
  • Spicy MCP
  • Cromanion MCP
  • Manifold MCP
  • Cloro MCP
  • Agency AI MCP

Search & Web

  • Web Scrapper
  • Firecrawl
  • Apify
  • Perplexity
  • Context.dev
  • Exa
  • Brave Search
  • Apify MCP
  • Ahrefs MCP
  • DeepWiki MCP
  • Dice MCP
  • GoDaddy MCP
  • Granted MCP
  • Microsoft Learn MCP
  • Viator MCp
  • Scholargateway MCP
  • Parallel MCP
  • Mintlify Index MCP
  • OpenWeather MCP
  • Simplescraper MCP
+ 8 more
  • SearchApi MCP
  • PubMed MCP
  • YouTube Transcript AI MCP
  • AccuWeather MCP
  • bioRxiv MCP
  • HEY Research Lab MCP
  • CourtListener MCP
  • Elicit MCP

Communication

  • Gmail
  • Google Meet
  • Google Calendar
  • Mailchimp
  • WhatsApp
  • Slack
  • OneSignal MCP
  • Brevo Docs MCP
  • Carbon Voice MCP
  • Hunter.io
  • Outlook
  • Nylas MCP
  • Resend MCP
  • Read AI MCP
  • Whats MCP
  • Inkbox AI
  • QrVerloz
  • ElevenLabs MCP
  • Fathom MCP

© 2026 MewCP. All rights reserved.

  1. Home
  2. Blogs
  3. AI Agent Tools: The Difference Between Knowing and Doing

AI Agent Tools: The Difference Between Knowing and Doing

by Rohit Gite, Co-Founder CTO @MewCP·August 30, 2026·8 min read

A language model can describe how to send the email. It cannot send it. This is the layer that turns a good answer into a real action, and where most teams get it wrong.

AI Agent Tools: The Difference Between Knowing and Doing

Ask a language model to email Dana the Q3 numbers and you get a very well written set of instructions for doing it yourself. Ask an agent with a send tool and you get back a message ID. That gap is the entire subject of this post. AI agent tools are the mechanism that converts a sentence the model produced into a change in the world, and everything interesting about production agents lives in that conversion.

Day 13 of the 30 Days of AI Agents series is the pivot point. The first twelve days were about what happens inside the agent: planning, memory, reasoning, reflection, evaluation. All of it happens in a sealed room. Text goes in, text comes out. There is no inbox in there, no calendar, no database connection, no filesystem.

Why prompting harder does not help

The first instinct when an agent fails to do something is to fix the prompt. Add a system message. Add examples. Tell it to be more decisive.

None of that helps, because the model is not refusing. It is producing the only artifact it can produce. A model that writes I have sent the email has not sent an email. It has generated a plausible sentence, which is exactly its job.

This is worth internalising because it predicts a specific failure. If you attach no tools and prompt an agent into acting confident, it will hallucinate completed actions. The words look identical to real success. The only structural fix is to give the model a way to actually cause the effect, and then to feed the real outcome back to it.

What AI agent tools actually are

A tool is four things bundled together, and only one of them is code the model ever sees.

  • A name. Stable, specific, verb shaped. send_email, not mail_helper.
  • A description. Written for the model, not for your teammates. This is the single biggest lever on selection accuracy.
  • An input schema. JSON Schema describing the arguments, with required fields, types and enums.
  • An executor. The function on your side that actually runs, and the result shape it returns.

The model only ever sees the first three. It never runs anything. It emits a structured request that says "call send_email with these arguments" and then stops. Your runtime decides whether to honour that request.

import json
from dataclasses import dataclass, replace
from typing import Any, Callable
 
@dataclass
class Tool:
    name: str
    description: str
    input_schema: dict
    run: Callable[[dict], Any]
    writes: bool = False          # does this change state outside the agent?
    irreversible: bool = False    # can it be undone?
 
send_email = Tool(
    name="send_email",
    description=(
        "Send an email from the signed-in user's account. "
        "Use only when the user has clearly asked for a message to be sent. "
        "Does not support attachments. Returns the provider message id."
    ),
    input_schema={
        "type": "object",
        "properties": {
            "to": {"type": "string", "description": "Single recipient address"},
            "subject": {"type": "string"},
            "body": {"type": "string"},
            "idempotency_key": {
                "type": "string",
                "description": "Stable key for this send. Reuse on retry.",
            },
        },
        "required": ["to", "subject", "body", "idempotency_key"],
    },
    run=lambda args: mail_client.send(**args),
    writes=True,
    irreversible=True,
)

Notice how much work the description does. It states when to use the tool, one hard limitation, and what comes back. Vague descriptions are the root cause of most bad tool selection, and no amount of system prompt tuning compensates for a tool that describes itself badly.

The four beats of a tool call

Four stacked dark panels labelled Intent, Selection, Arguments and Result, connected by an amber line, showing the tool call loop

Every real action moves through four beats, and each one fails differently.

  1. Intent. The agent decides that something outside the conversation has to change. Failure here looks like an agent that answers instead of acting.
  2. Selection. It picks one tool. Failure looks like the wrong tool, or three tools when one would do.
  3. Arguments. It fills the schema. Failure looks like a missing required field, an invented enum value, or a date in the wrong format.
  4. Result. The outcome goes back into context. Failure here is the sneaky one: if the agent never reads the result, it cannot recover from an error and it cannot verify its own work.

The loop that implements this is small. The shape below follows the tool use message format used by Claude and similar APIs. Check your provider's exact field names, but the control flow is the same everywhere.

MAX_RESULT_CHARS = 4000
 
def dispatch(registry: dict[str, Tool], name: str, args: dict) -> dict:
    tool = registry.get(name)
    if tool is None:
        return {"ok": False, "error": f"unknown tool: {name}"}
    try:
        return {"ok": True, "result": tool.run(args)}
    except Exception as exc:
        # Return the error to the model instead of crashing the run.
        return {"ok": False, "error": f"{type(exc).__name__}: {exc}"}
 
def run_agent(user_message: str, registry: dict[str, Tool], max_steps: int = 8):
    messages = [{"role": "user", "content": user_message}]
 
    for _ in range(max_steps):
        reply = call_model(messages, tools=[spec(t) for t in registry.values()])
        messages.append({"role": "assistant", "content": reply.content})
 
        calls = [b for b in reply.content if b["type"] == "tool_use"]
        if not calls:
            return reply.text          # the agent is done talking to the world
 
        results = []
        for call in calls:
            outcome = dispatch(registry, call["name"], call["input"])
            results.append({
                "type": "tool_result",
                "tool_use_id": call["id"],
                "content": json.dumps(outcome)[:MAX_RESULT_CHARS],
                "is_error": not outcome["ok"],
            })
 
        messages.append({"role": "user", "content": results})
 
    raise RuntimeError("step budget exhausted before the agent finished")

Three details in there matter more than they look. Exceptions become messages instead of crashes, so the agent can read PermissionDenied and try something sensible. Results are truncated, because a database tool that returns 40,000 rows will eat the context window and take the rest of the conversation with it. And there is a hard step budget, because an agent with tools and no ceiling will happily loop until your bill notices.

The six tool families most agents need

A two column dark layout separating Search, Browser and Database from Email, Calendar and Files

Almost every agent people build in the first year draws from the same six families. Three of them read the world. Three of them change it.

Tool familyClassWhat it returnsThe failure you will hit
SearchReadRanked snippets and URLsStale or irrelevant results the agent trusts completely
BrowserRead, sometimes writePage text, DOM state, screenshotsSlow, brittle selectors, and the agent clicking something real
DatabaseBothRows, counts, write receiptsUnbounded result sets, and writes with no transaction boundary
EmailWrite, irreversibleProvider message IDDuplicate sends on retry, wrong recipient, no recall
CalendarWrite, reversibleEvent ID and invite statusTimezone drift, and inviting people who did not consent
FilesWrite, mostly reversiblePath, size, checksumPath traversal, and silently overwriting an existing file

Search is the one to build first because it is safe and it fixes the model's knowledge boundary. Email is the one to build last, because it is the one your users will notice if it misfires.

Browser sits in an awkward middle. Treat it as a write tool whenever the page it visits has buttons, because the agent will find them.

Read, write, and the things you cannot undo

A cat character pausing at a half open amber door with the annotations scope, log and confirm floating beside it

Capability and authorization are separate problems, and the second one is usually solved late. Every tool call runs as somebody. If your agent holds one API key for all users, then user A's agent can read user B's data the moment the model picks the wrong argument.

Three rules cover most of it.

Scope the credential to the requester. The identity that executes the tool should be the identity that asked for it, carried through the whole call. One shared key is a breach waiting for a bad argument.

Log the call, not just the answer. Store the tool name, the arguments, the caller, the result and the timestamp. When someone asks why the agent emailed a customer at 3am, the conversation transcript alone will not tell you.

Gate anything irreversible. Reversible writes can run freely. Irreversible ones should stop and ask.

def with_approval(tool: Tool, approve: Callable[[str, dict], bool]) -> Tool:
    def guarded(args: dict):
        if tool.irreversible and not approve(tool.name, args):
            return {"status": "declined", "reason": "user did not approve this action"}
        return tool.run(args)
    return replace(tool, run=guarded)

Returning a declined result instead of raising matters. The agent reads it, understands the action did not happen, and can propose an alternative. If you raise, it just sees a failure and often retries the same thing.

Which brings up retries. Read tools can be retried freely. Write tools cannot. If send_email times out after the provider already accepted the message, a naive retry sends it twice.

def send_email_executor(args: dict) -> dict:
    key = args["idempotency_key"]
    existing = idempotency_store.get(key)      # durable, not an in-process dict
    if existing:
        return existing                        # replay the original outcome
    response = mail_client.send(
        to=args["to"], subject=args["subject"], body=args["body"]
    )
    outcome = {"message_id": response.id, "status": "sent"}
    idempotency_store.put(key, outcome, ttl_seconds=86400)
    return outcome

Make the key part of the schema so the model produces a stable one per logical action, and store it somewhere that survives a process restart.

Failure modes nobody warns you about

Too many tools. Selection accuracy drops as the tool list grows and the descriptions start overlapping. Twelve well described tools beat forty vague ones. If two tools could plausibly answer the same request, merge them or sharpen both descriptions until they cannot.

Silent success. An API returns 200 and does nothing useful. A file write lands in a container that is about to be destroyed. The agent reports success because the tool told it to. Where it matters, verify: read back the row, check the message ID resolves.

Result bloat. One unfiltered query and the next model call carries 30,000 tokens of rows nobody reads. Paginate, project only the columns you need, and truncate with an explicit marker so the agent knows the data was cut.

Arguments the schema allowed but reality did not. A valid ISO date that is in the past. A recipient string that parses but belongs to a different tenant. Validate in the executor, and return a specific error message the model can act on.

Before you attach a tool to a live account

  • The name is a verb and the description says when to use it and when not to
  • Every required field is actually required, and enums are constrained
  • The executor validates arguments again on your side
  • Errors return as structured results, not exceptions
  • Results are bounded in size and paginated where relevant
  • The tool is classified read, reversible write, or irreversible write
  • Irreversible writes pass through an approval gate
  • Write tools accept an idempotency key and replay instead of repeating
  • The credential is scoped to the user who made the request
  • Every call is logged with caller, arguments, result and time

Ten lines. Most agent incidents I have seen trace back to one of them being skipped.

Where this goes next

The reasoning layer decides. The tool layer acts. Once you have both, the hard part stops being the model and starts being the plumbing: hosting the tools somewhere your agent can reach them, authenticating each call as the right user, storing per-user credentials so they never touch a prompt, and keeping the whole thing observable when ten thousand people use it at once.

That is the part MewCP handles, so you can spend your time on the tools themselves rather than the infrastructure around them.

Tomorrow, Day 14 goes one level down: what exactly is a tool, field by field, and why the description matters more than the code.

ContentsAugust 30, 2026
  1. Why prompting harder does not help
  2. What AI agent tools actually are
  3. The four beats of a tool call
  4. The six tool families most agents need
  5. Read, write, and the things you cannot undo
  6. Failure modes nobody warns you about
  7. Before you attach a tool to a live account
  8. Where this goes next
Author

Rohit Gite, Co-Founder CTO @MewCP

Share

Build with MewCP

Connect your AI agents to real tools in minutes.

Get started