SocialAPIs: Facebook & Instagram Data
OfficialSocialAPIs MCP Server gives AI agents read-only access to Facebook and Instagram public data through grouped MCP tools and legacy per-endpoint tool names.
Facebook Pages: get page ID/details, posts with date filters, videos, reels, albums, and album items.
Facebook Groups: get group ID/metadata/details, posts with date filters, videos, albums, and album items.
Facebook Posts: get post ID/details/extended details, attachments, video details, comments, and comment replies.
Facebook Search: search pages, people, posts, videos, and locations.
Facebook Ads Library: search ads, find advertisers by keyword, get ad/page/archive details, and list supported countries.
Facebook Marketplace: search listings, vehicles, rentals, listing details, seller details, categories, and city coordinates.
Facebook Media: download images, videos, and audio from Facebook URLs.
Instagram Profiles: get user ID/profile details, profile posts, reels, highlights, and highlight details.
Instagram Posts: extract post ID/shortcode and get full post details.
Instagram Reels: get reels feed and reels by audio/music ID.
Instagram Search: find popular users, hashtags, and places by keyword.
Instagram Locations: get location posts (recent or ranked) and nearby locations.
Deployment: use hosted remote MCP or local npx/stdio, authenticate with an API key, and receive structured results with credit usage/remaining.
Provides tools to retrieve Facebook page details, posts, reels, group information, and post comments via the SocialAPIs unified API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SocialAPIs: Facebook & Instagram DataGet Nike's Facebook page details"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SocialAPIs MCP Server

Facebook & Instagram data for AI agents — local (npx) or hosted (remote MCP)
Website • Documentation • Discord • npm
Official SDKs: Python • JavaScript / TypeScript • Go
🚀 Quick Start
AI agents (Cline, Claude Code, Cursor): follow
llms-install.mdfor step-by-step install and verification.
One-click: use the Install in Cursor button above — then replace YOUR_API_KEY in Cursor's MCP settings with your key. Also listed on Smithery, cursor.directory, mcp.so and the official MCP Registry (io.github.SocialAPIsHub/social-media-api).
Option A — Hosted (remote MCP, no install)
Point any client that supports remote MCP servers (Streamable HTTP) at:
https://mcp.socialapis.io/mcpAuthenticate with your SocialAPIs API key in a header:
Authorization: Bearer YOUR_API_KEY(x-api-token: YOUR_API_KEY also works.) Tool listing works without a key; tool calls need one. Example config for clients that take a URL + headers:
{
"mcpServers": {
"socialapis": {
"url": "https://mcp.socialapis.io/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}Option B — Local (npx, stdio)
Installation
npm install -g @socialapis/mcpConfiguration
Add to your Claude Desktop config:
macOS:
nano ~/Library/Application\ Support/Claude/claude_desktop_config.jsonWindows:
notepad %APPDATA%\Claude\claude_desktop_config.jsonRelated MCP server: Facebook MCP Server
🔧 Configuration
Method 1: Command Line Argument (Recommended for Claude Desktop)
{
"mcpServers": {
"socialapis": {
"command": "npx",
"args": ["-y", "@socialapis/mcp", "YOUR_API_KEY"]
}
}
}Method 2: Environment Variable
# Set environment variable
export SOCIALAPIS_API_KEY=your_api_key_here
# Run without argument
npx @socialapis/mcpMethod 3: .env File (For Development)
# Copy example file
cp .env.example .env
# Edit with your values
nano .env.env file:
SOCIALAPIS_API_KEY=your_api_key_here
MCP_PROXY_URL=https://mcp.socialapis.ioEnvironment Variables
Variable | Description | Default |
| Your SocialAPIs API key | None (required) |
| MCP proxy server URL |
|
| HTTP server port |
|
| Backend API URL |
|
| Live endpoint catalog the server follows (server only) |
|
| How often the catalog (server) or tool list (npm client) is re-read |
|
|
| on |
Live catalog
Prices, descriptions and parameters follow the SocialAPIs API without a new release. The server reads the public endpoint catalog at startup (3 s timeout) and every 10 minutes, compares it with src/catalogBaseline.json (the catalog src/tools.js was written against) and applies only what changed since: a new price replaces the tool's Pricing: sentence, an edited description or parameter replaces ours, added and removed parameters are added and removed, and a disabled endpoint's action says "Currently unavailable." Tool and action names never change, and new endpoints don't become tools until a release adds them. If the catalog can't be read, or a change would make two actions' parameters conflict, the last good definitions (at first the bundled ones) stay. GET /health shows catalog: { source, version, fetchedAt, routes }. The npm client re-reads the tool list every 10 minutes and sends notifications/tools/list_changed when it changes.
After updating tools.js to match the API, refresh the baseline: node scripts/snapshot-catalog.mjs --from https://auth.socialapis.io/api/public/endpoints (public fields only).
Get API Key
Sign up at socialapis.io
Go to Dashboard
Copy your API key
Replace
YOUR_API_KEYin config
Test It
Restart Claude Desktop and ask:
Get Nike's Facebook page details📋 Features
🌐 One API key - Facebook and Instagram behind a single interface
🤖 AI-First - Built for Claude, Cursor, and AI agents
📊 Rich Data - Posts, comments, engagement metrics
🔍 Advanced Filtering - Time ranges, pagination
🎯 Simple Auth - No OAuth complexity
🧩 Structured output - every tool declares an output schema and returns
{ result, creditsCharged, creditsRemaining }, so agents can track credit spend directly🛡️ Read-only annotations - all tools are marked
readOnlyHint, so clients can skip confirmation prompts⚡ Fast - Global edge network
🔒 Secure - API keys stay local
🛠️ Available Tools
12 tools covering 50 actions across Facebook and Instagram. Each tool groups one resource and takes an action argument; every action maps to one REST endpoint on api.socialapis.io. Tool descriptions list each action, the parameters it needs and its credit cost.
Tool | Actions |
|
|
|
|
|
|
|
|
|
|
|
|
| Download URLs for Facebook images and videos |
|
|
|
|
|
|
| Popular users, hashtags and places for a keyword |
|
|
Example call: facebook_page with {"action": "posts", "link": "https://www.facebook.com/nike", "limit": 9}.
Upgrading from 1.x: the earlier per-endpoint tool names (facebook_get_page_details, instagram_get_profile_posts, …) still work when called directly, so existing prompts and scripts keep running. They're no longer listed. If your client auto-approves tools by name, add the new names.
Not supported yet
Only Facebook and Instagram are live today. TikTok, X / Twitter, LinkedIn and YouTube are on the roadmap with no committed dates — tools for them will appear here only once they ship.
Track the platform roadmap at socialapis.io/api-sources.
💡 Usage examples
Each prompt below is a real Claude Desktop session. Some of these are single-tool-call patterns ("get me X"); some require Claude to chain multiple calls + aggregate the results (noted where).
Single-call patterns (fast, cheap)
What's Nike's follower count on Facebook?
→ Uses facebook_page action=details (1 credit)
Get the latest 9 posts from facebook.com/EngenSA
→ Uses facebook_page action=posts with limit=9 (1-3 credits depending on actual returned count)
Show me the Meta ads currently running for "Apple Vision Pro" in Germany
→ Uses facebook_ads action=search (1 credit)Multi-call patterns (Claude orchestrates these — but it's slower + more expensive)
Compare engagement on Nike vs Adidas's last 9 Facebook posts
→ Claude calls facebook_page action=posts twice (~2-6 credits total),
aggregates reactions/comments/shares per post, returns a comparison.
What are people saying in the comments on Coca-Cola's last 3 posts?
→ Claude calls facebook_page action=posts (1 credit) then
facebook_post action=comments 3 times (3 credits) and summarizes.
Show me marketplace listings for "PlayStation 5" under $400 in Berlin
→ Claude calls facebook_marketplace action=city_coordinates (1 credit) +
facebook_marketplace action=search with filters (1 credit).What this MCP server does NOT do
Some queries look natural in a chat ("compare engagement over the last month") but require aggregations the API doesn't expose as a single tool yet. Claude can still answer them, but it'll fan out into many tool calls — which is slow + expensive.
Query shape | Why it's hard |
"Engagement rate over the last 30 days" for a page | Requires fetching every post in the date range (paginated, |
"Compare engagement rates between Brand A, B, C over the last month" | Same problem, 3× — one paginated fetch per brand, then comparison math. Works for small windows; slow for "last month" on high-volume pages. |
Historical archive older than what Facebook itself serves | We surface what Facebook makes publicly visible. Posts that scrolled off Facebook's visible feed aren't retrievable. |
Server-side time-series (daily engagement, weekly growth) | Not yet — on the roadmap as a future |
If your use case maps to one of these patterns and you want the aggregation pre-computed instead of LLM-orchestrated, contact support with the specific query — we're prioritizing the aggregation endpoint based on customer demand.
🏗️ Architecture
Claude Desktop
↓
@socialapis/mcp (local MCP client)
↓
https://mcp.socialapis.io (global proxy)
↓
https://api.socialapis.io (data API)Why this architecture?
✅ Low latency (global edge network)
✅ High reliability (99.9% uptime)
✅ Auto rate limiting
✅ Smart caching
✅ Your API key stays local
🔧 Development
Local Setup
# Clone repository
git clone https://github.com/SocialAPIsHub/mcp-server.git
cd mcp-server
# Install dependencies
npm install
# Run MCP client
npm start YOUR_API_KEY
# Run HTTP proxy server
npm run serveProject Structure
mcp-server/
├── src/
│ ├── tools.js # The 50 endpoint definitions (one per action)
│ ├── groups.js # Groups them into the 12 listed tools
│ ├── catalogBaseline.json # The API catalog tools.js was written against
│ ├── catalogOverlay.js # Applies live catalog changes to the definitions
│ └── liveCatalog.js # Fetches the live catalog (startup + every 10 min)
├── scripts/snapshot-catalog.mjs # Rewrites catalogBaseline.json
├── test/ # node --test (npm run test:unit)
├── mcp-wrapper.js # MCP client (runs locally)
├── server.js # HTTP proxy server
├── package.json
├── Dockerfile
└── README.mdTesting
# Unit tests
npm run test:unit
# Test MCP client locally
node mcp-wrapper.js YOUR_API_KEY
# Test HTTP proxy
curl http://localhost:3001/health
curl http://localhost:3001/tools
# Test specific tool
curl -X POST http://localhost:3001/proxy \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tool":"facebook_page","arguments":{"action":"details","link":"https://facebook.com/nike"}}'📊 Pricing
Plan | Credits / month | Price |
Free | 200 | $0 |
Pro | 1,500 | $4.99 |
Ultra | 30,000 | $49 |
Mega | 120,000 | $179 |
Enterprise | Custom |
Most tools cost 1 credit per call; each tool description states its exact price. Current plans: socialapis.io/pricing.
🤝 Contributing
We welcome contributions! Please see CONTRIBUTING.md for details.
Quick Contribution Guide
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
📖 Documentation
Agent skill: teaches Claude Code, Cursor, Codex and other coding agents to use SocialAPIs (
npx skills add SocialAPIsHub/skills)
💬 Support
📧 Email: support@socialapis.io
💬 Discord: discord.gg/D5bQskrwV
🐛 Issues: GitHub Issues
📚 Docs: docs.socialapis.io
🗺️ Roadmap
Shipped:
Facebook API support — 7 tools, 37 actions (Pages, Groups, Posts, Search, Ads Library, Marketplace, Media)
Instagram support — 5 tools, 13 actions (Profiles, Posts, Reels, Highlights, Discovery / Locations)
MCP server implementation
HTTP proxy server
npm package published —
@socialapis/mcpMCP Registry listing — registry.modelcontextprotocol.io
Python SDK —
socialapis-sdkon PyPI (50 endpoints, MIT)JavaScript / TypeScript SDK —
socialapis-sdkon npm (Node 18+, Bun, Deno, browsers)Go SDK — github.com/SocialAPIsHub/socialapis-go (idiomatic, zero deps)
Agent skill — github.com/SocialAPIsHub/skills for Claude Code, Cursor, Codex and other coding agents
Upcoming:
TikTok support
X (Twitter) support
LinkedIn support
YouTube support
Advanced analytics — server-side aggregation endpoints (engagement-over-time, brand comparisons) so multi-call patterns become a single tool call
Real-time webhooks — push notifications on new posts / engagement thresholds
LangChain integration
Platform priorities shift based on customer demand. The fastest way to push something up the queue is to email support@socialapis.io or DM @socialapis on Telegram with the use case.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
Built with Model Context Protocol
Powered by Anthropic Claude
Inspired by the AI agent community
📇 Listed on
Also on the Official MCP Registry, Smithery, LobeHub, mcp.so, mcpservers.org, cursor.directory and awesome-remote-mcp-servers.
🌟 Star History
Made with ❤️ by the SocialAPIs Team
Python SDK • JS SDK • Go SDK
Available Tools
12 toolsfacebook_adsFacebook: AdsARead-onlyInspect
Meta Ads Library: search ads, find advertisers by keyword, advertiser page details, single ad details and supported countries.
Actions:
action=search: Search ads in the Meta Ad Library. Pass a keyword (query) to find ads about a topic, or ad_page_id to list one advertiser's ads; filter by country, active status and date range, sort by impressions or recency. Returns ads with creative, body text, dates, platforms and snapshot URL, plus an end_cursor. Get an advertiser's ad_page_id from action=keywords or facebook_page (action=details). Pricing: 1 credit per call. Inputs: query (optional), ad_page_id (optional), country (optional), activeStatus (optional), after_time (optional), before_time (optional), sort_data (optional), end_cursor (optional).
action=keywords: Find advertisers running ads that match a keyword: returns Facebook pages with their page_id and ad count. Use it to discover who advertises on a topic, then pass a page_id to action=search (as ad_page_id) or action=page_details. To get the ads for a keyword directly, use action=search. Pricing: 1 credit per call. Inputs: query (required), country (optional).
action=page_details: Get an advertiser's Ads Library profile: page name, verification status, category, location and total ad count. Needs the page ID (ad_page_id from facebook_page (action=details) or page_id from action=keywords). To list the ads themselves, use action=search with ad_page_id. Pricing: 1 credit per call. Inputs: page_id (required).
action=archive_details: Get one Ad Library ad in full: creative, body text, CTA, platforms, countries, date range, and spend and impression estimates where Meta publishes them. Needs the ad_archive_id from a action=search result. Pricing: 1 credit per call. Inputs: ad_archive_id (required), page_id (optional), country (optional), is_ad_non_political (optional), is_ad_not_aaa_eligible (optional).
action=countries: List the country codes the Ads Library tools accept in their country parameter. Pricing: 1 credit per call. Inputs: none.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Keyword. search: words in the ads (or pass ad_page_id instead) · keywords: a topic to find advertisers for, e.g. running shoes. Required for: keywords. Optional for: search. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| country | No | ISO country code or "ALL". Optional for: search, keywords, archive_details. | |
| page_id | No | Advertiser page ID: ad_page_id from facebook_page (action=details), or page_id from action=keywords. Required for: page_details. Optional for: archive_details. | |
| sort_data | No | Sort by "impressions" or "recent". Optional for: search. | |
| ad_page_id | No | Facebook AD Page ID (alternative to query). Optional for: search. | |
| after_time | No | Filter ads after this date (YYYY-MM-DD). Optional for: search. | |
| end_cursor | No | Pagination cursor. Optional for: search. | |
| before_time | No | Filter ads before this date (YYYY-MM-DD). Optional for: search. | |
| activeStatus | No | Filter: ALL, Active, or Inactive. Optional for: search. | |
| ad_archive_id | No | Ad Library archive ID of the ad (ad_archive_id from a action=search result). Required for: archive_details. | |
| is_ad_non_political | No | Filter non-political ads. Optional for: archive_details. | |
| is_ad_not_aaa_eligible | No | Filter AAA eligibility. Optional for: archive_details. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: a cost model ('Pricing: 1 credit per call') on every action, the presence of an end_cursor for pagination on search, and the caveat that spend/impression estimates are only returned 'where Meta publishes them'. It does not discuss rate limits or auth, but the annotations carry the safety burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with the overall scope, then cleanly organized as one bullet per action with a consistent 'Pricing/Inputs' footer, which makes scanning easy. It loses a point for redundancy: the identical 'Pricing: 1 credit per call' line is repeated five times, and the 'Inputs:' lines duplicate what the 100%-covered schema already states.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, 5-action multiplexed tool, the description covers every action, its inputs, its return shape in brief, its cost, and the cross-tool workflow to obtain each required ID. An output schema exists, so return-value detail is correctly left out, and nothing an agent needs to invoke a given action successfully is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already marks each parameter with 'Required for: X / Optional for: Y', so the description's per-action 'Inputs:' lines largely restate structured data. It does add a small amount of meaning (ad_page_id described as 'an alternative to query', and derivation of ad_archive_id from search results), but the baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (Meta Ads Library) and enumerates five distinct actions with a specific verb+output for each: search ads, find advertisers, advertiser page details, single ad details, supported countries. It also disambiguates from siblings by naming facebook_page (action=details) as the source of ad_page_id. An agent can tell exactly what each action does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given for every fork: action=keywords to discover advertisers then feed the page_id into action=search or action=page_details, and conversely 'To get the ads for a keyword directly, use action=search' rather than keywords. Prerequisites are stated per action (archive_details 'Needs the ad_archive_id from a action=search result'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
facebook_groupFacebook: GroupARead-onlyInspect
Public Facebook groups: details, group ID, posts, videos and photo albums.
Actions:
action=details: Get a public Facebook group's profile: name, description, member count, privacy, rules and activity stats. Use action=posts for its posts. Pricing: 1 credit per call. Inputs: link (required).
action=id: Resolve a Facebook group URL to its numeric group ID. Use action=details for the group's data. Pricing: 1 credit per call. Inputs: link (required).
action=posts: List recent posts from a public Facebook group, with text, media, author, reactions and comment counts. Returns 3-9 posts per call plus an end_cursor for the next page; filter by date with after_time / before_time. Pricing: ceil(posts_returned / 3) credits per call, minimum 1. Inputs: link (required), limit (optional), end_cursor (optional), after_time (optional), before_time (optional), timezone (optional).
action=videos: List videos posted in a public Facebook group, with video_id, title, duration, view count and thumbnail. Returns an end_cursor for the next page. Pricing: 1 credit per call. Inputs: link (required), end_cursor (optional).
action=albums: List the photo albums of a public Facebook group, with album_id, album_title, url, thumbnail_uri, photos_count and videos_count. Returns an end_cursor for the next page. Needs the numeric group ID (group_id) from action=id. To get the photos in an album, pass its album_id to action=album_items. Pricing: 1 credit per call. Inputs: group_id (required), limit (optional).
action=album_items: Get the photos and videos inside a Facebook album (from a page or a group): media_id, media_type, url, thumbnail_uri and timestamp (Unix seconds). Needs an album_id from facebook_page (action=albums) or action=albums. Returns an end_cursor for the next page. Pricing: 1 credit per call. Inputs: album_id (required), end_cursor (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Facebook group URL. Required for: details, id, posts, videos. | |
| limit | No | Results per call. posts: 3-9 (default 3) · albums: 8-16 (default 8). Optional for: posts, albums. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| album_id | No | Album ID, from facebook_page (action=albums) or action=albums. Required for: album_items. | |
| group_id | No | Facebook group ID, from action=id. Required for: albums. | |
| timezone | No | IANA timezone for returned timestamps, e.g. UTC or America/New_York. Default: UTC. Optional for: posts. | |
| after_time | No | ISO 8601 timestamp. Optional for: posts. | |
| end_cursor | No | Pagination cursor. Optional for: posts, videos, album_items. | |
| before_time | No | ISO 8601 timestamp. Optional for: posts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, non-destructive behavior, so the description need not cover safety. It goes further by disclosing per-action credit pricing, return sizes (3-9 posts per call), pagination via end_cursor, and timezone handling — genuinely useful operational context. It stops short of noting failure modes for private/inaccessible groups or any rate limits beyond pricing, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One lead sentence plus a clean per-action bullet format that groups purpose, pricing, and inputs consistently, so the agent can scan to a single action. It is somewhat long and repeats 'Pricing: 1 credit per call' across actions, but no sentence is empty of content and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-action tool with an output schema, the description supplies everything an agent needs: what each action returns, which inputs it requires, the inter-action dependencies (id before albums, albums before album_items), and cross-tool links to facebook_page. Return-value details are covered by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning: it maps each parameter to the actions that require it (link for details/id/posts/videos, group_id for albums, album_id for album_items) and explains that group_id comes from action=id and album_id from a prior albums call. The after_time/before_time date-filtering intent is also clarified beyond the bare ISO-8601 schema note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific resource (public Facebook groups) and its scope (details, group ID, posts, videos, photo albums), then each action is spelled out with the exact data it returns. It clearly differentiates itself from siblings like facebook_page by explicitly noting that album_items works for both, and by restricting the domain to groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Every action carries explicit routing guidance: 'Use action=posts for its posts', 'Use action=details for the group's data', and 'To get the photos in an album, pass its album_id to action=album_items'. Prerequisites are stated (albums needs the numeric group ID from action=id), so the agent knows the correct call sequence rather than guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
facebook_marketplaceFacebook: MarketplaceARead-onlyInspect
Facebook Marketplace: search listings, vehicles and rentals, listing and seller details, categories and city coordinates.
Actions:
action=search: Search general Facebook Marketplace listings (items for sale) by keyword or category near a location, with price, condition, radius and sort filters. Returns listings with their listing_id, plus an end_cursor. For cars and other vehicles use action=vehicles; for homes and rooms to rent use action=rentals. Get coordinates from action=city_coordinates. Pricing: 1 credit per call. Inputs: query (optional), category_url (optional), commerce_search_sort_by (optional), commerce_search_and_rp_condition (optional), filter_location_latitude (optional), filter_location_longitude (optional), filter_price_lower_bound (optional), filter_price_upper_bound (optional), filter_radius_km (optional), posted_today (optional), exact_match (optional), limit (optional), end_cursor (optional).
action=vehicles: Search Facebook Marketplace vehicle listings (cars, trucks, motorcycles) near a location, with price, radius and seller-type filters. Returns listings with title, price, mileage, year and listing_id, plus an end_cursor. For non-vehicle items, use action=search. Pricing: 1 credit per call. Inputs: sort_by (optional), filter_location_latitude (optional), filter_location_longitude (optional), filter_price_lower_bound (optional), filter_price_upper_bound (optional), filter_radius_km (optional), is_c2c_listing_only (optional), end_cursor (optional).
action=rentals: Search Facebook Marketplace rental listings (apartments, houses, rooms) near a location, with price, bedroom, bathroom and radius filters. Returns rental listings with their listing_id, plus an end_cursor. For items for sale, use action=search. Pricing: 1 credit per call. Inputs: sort_by (optional), filter_location_latitude (optional), filter_location_longitude (optional), filter_price_lower_bound (optional), filter_price_upper_bound (optional), filter_radius_km (optional), filter_bedrooms_min (optional), filter_bedrooms_max (optional), filter_bathrooms_min (optional), filter_bathrooms_max (optional), end_cursor (optional).
action=listing: Get one Marketplace listing in full: title, price, description, condition, all photos, location and seller. Needs the listing_id from a Marketplace search result. Pricing: 1 credit per call. Inputs: listing_id (required).
action=seller: Get a Marketplace seller's profile: name, join date, rating, review count and badges. Needs the seller_id from action=listing. Pricing: 1 credit per call. Inputs: seller_id (required).
action=categories: List Marketplace categories with their IDs and category_url values. Use a category_url to filter action=search. Pricing: 1 credit per call. Inputs: none.
action=city_coordinates: Convert a city name to the latitude and longitude that the Marketplace search tools expect in filter_location_latitude / filter_location_longitude. Pricing: 1 credit per call. Inputs: city (required), country (optional), exactly_one (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name, e.g. Austin. Required for: city_coordinates. | |
| limit | No | Maximum number of items to return. Default: 24. Optional for: search. | |
| query | No | Keyword to search listings for, e.g. iphone 15. Optional for: search. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| country | No | Country name or code. Optional for: city_coordinates. | |
| sort_by | No | Sort order. vehicles: CREATION_TIME_DESCEND, PRICE_ASCEND, VEHICLE_MILEAGE_ASCEND, … · rentals: CREATION_TIME_DESCEND, PRICE_ASCEND, BEST_MATCH. Optional for: vehicles, rentals. | |
| seller_id | No | Seller ID, from the seller field of action=listing. Required for: seller. | |
| end_cursor | No | Pagination cursor. Optional for: search, vehicles, rentals. | |
| listing_id | No | Marketplace listing ID, from a Marketplace search result. Required for: listing. | |
| exact_match | No | When "true", exact match search. Optional for: search. | |
| exactly_one | No | When "true", return exactly one result. Optional for: city_coordinates. | |
| category_url | No | Category URL slug. Optional for: search. | |
| posted_today | No | When "true", limit to items posted today. Optional for: search. | |
| filter_radius_km | No | Search radius around the center in kilometres, e.g. 40. Optional for: search, vehicles, rentals. | |
| filter_bedrooms_max | No | Maximum number of bedrooms. Optional for: rentals. | |
| filter_bedrooms_min | No | Minimum number of bedrooms, e.g. 2. Optional for: rentals. | |
| is_c2c_listing_only | No | Individual sellers only. Optional for: vehicles. | |
| filter_bathrooms_max | No | Maximum number of bathrooms. Optional for: rentals. | |
| filter_bathrooms_min | No | Minimum number of bathrooms, e.g. 1. Optional for: rentals. | |
| commerce_search_sort_by | No | Sort: BEST_MATCH, CREATION_TIME_DESCEND, PRICE_ASCEND, etc. Optional for: search. | |
| filter_location_latitude | No | Latitude of the search center, e.g. 30.2672 (from action=city_coordinates). Optional for: search, vehicles, rentals. | |
| filter_price_lower_bound | No | Minimum price in the local currency, whole number, e.g. 100. Optional for: search, vehicles, rentals. | |
| filter_price_upper_bound | No | Maximum price in the local currency, whole number, e.g. 2000. Optional for: search, vehicles, rentals. | |
| filter_location_longitude | No | Longitude of the search center, e.g. -97.7431 (from action=city_coordinates). Optional for: search, vehicles, rentals. | |
| commerce_search_and_rp_condition | No | Condition: new, used_like_new, used_good, used_fair. Optional for: search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. Beyond that, the description discloses per-call credit pricing, pagination via end_cursor, and the required upstream identifiers for listing/seller calls, which are genuinely useful operational facts the annotations do not carry. It stops short of auth or rate-limit detail, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The length is justified by seven actions and 25 parameters, and structure is strong: a front-loaded overview followed by one labeled block per action with purpose, returns, alternatives, and inputs. The repeated 'Pricing: 1 credit per call' line is mildly redundant but earns its place by informing cost decisions per action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity, multi-action tool the description covers every action's purpose, alternatives, prerequisites, and returns, and an output schema exists to handle response shape. Nothing an agent needs in order to pick the right action and supply the right arguments is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already carries its own 'Required for:'/'Optional for:' tagging, so the schema does the heavy lifting. The per-action 'Inputs:' lists in the description mirror that mapping but add no syntax, format, or constraint detail beyond what the schema states (e.g., condition values, coordinate examples). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the resource (Facebook Marketplace) and enumerates every operation it covers: listings, vehicles, rentals, listing/seller details, categories, and city coordinates. Each action entry begins with a specific verb+resource (e.g., 'Search Facebook Marketplace vehicle listings'), and the Marketplace scope clearly separates it from sibling tools like facebook_search or facebook_post.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routing is explicit at every decision point: 'For cars and other vehicles use action=vehicles; for homes and rooms to rent use action=rentals. Get coordinates from action=city_coordinates,' and the reverse guards ('For non-vehicle items, use action=search'). It also states the dependency chain (listing needs listing_id from a search; seller needs seller_id from listing), so an agent never has to infer the correct action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
facebook_media_downloadFacebook: Media DownloadARead-onlyInspect
Resolve a Facebook media URL (image, video or audio, e.g. from a post or reel) to direct downloadable file URLs. Returns URLs, not file bytes. Pricing: 1 credit per call. Inputs: url (required).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Facebook media URL to download |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds two genuinely useful behavioral facts beyond that: it returns URLs rather than file bytes (so the agent must fetch the file separately), and it costs 1 credit per call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and return semantics before the pricing and input notes. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter resolver with an output schema and full annotation coverage, the description supplies everything needed: what it resolves, that the output is URLs not bytes, and the cost. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage, so the schema already documents it fully. The description only restates that url is required and adds no syntax, format, or constraint detail beyond the schema; the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resolve a Facebook media URL ... to direct downloadable file URLs') and enumerates accepted media types (image, video, audio) with example sources (post, reel). This clearly separates it from the sibling listing/search tools like facebook_post or facebook_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scope statement ('e.g. from a post or reel') and by the explicit note that it returns URLs rather than bytes, which tells the agent when this is the right call. However, there is no explicit when-to-use/when-not guidance and no named alternative among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
facebook_pageFacebook: PageARead-onlyInspect
Facebook pages: profile details, page ID, posts, videos, reels and photo albums.
Actions:
action=details: Get a Facebook page's profile: name, category, follower and like counts, bio, contact info (email, phone, website, address), rating and the ad_page_id used by the Ads Library tools. Use it when you have the page URL; to find a page by name, use facebook_search (action=pages) first. Pricing: 1 credit per call; 5 credits when exact_followers_count=true. Inputs: link (required), exact_followers_count (optional).
action=id: Resolve a Facebook page URL to its numeric page ID. Use it when another tool needs a page or profile ID; use action=details for the page's data. Pricing: 1 credit per call. Inputs: link (required).
action=posts: List a Facebook page's recent posts, newest first, with text, media, reactions, comment and share counts. Returns 3-9 posts per call plus an end_cursor for the next page; filter by date with after_time / before_time. For reels or videos only, use action=reels or action=videos. Pricing: ceil(posts_returned / 3) credits per call, minimum 1. Inputs: link (required), limit (optional), end_cursor (optional), after_time (optional), before_time (optional), timezone (optional).
action=videos: List videos uploaded to a Facebook page, with video_id, title, duration, view count and thumbnail. Provide the page URL (link) or its numeric profile_id. Returns an end_cursor for the next page. For short-form reels, use action=reels. Pricing: 1 credit per call. Inputs: link (optional), profile_id (optional), limit (optional), end_cursor (optional).
action=reels: List a Facebook page's reels (short-form videos). Returns an end_cursor for the next page. For long-form videos, use action=videos. Pricing: 1 credit per call. Inputs: link (required), end_cursor (optional).
action=albums: List the photo albums of a Facebook page, with album_id, album_title, url, thumbnail_uri and album_items_count (text, e.g. "400 items"). Needs the numeric page ID (profile_id) from action=id. Returns an end_cursor for the next page. To get the photos in an album, pass its album_id to action=album_items. Pricing: 1 credit per call. Inputs: profile_id (required), limit (optional), end_cursor (optional).
action=album_items: Get the photos and videos inside a Facebook album (from a page or a group): media_id, media_type, url, thumbnail_uri and timestamp (Unix seconds). Needs an album_id from action=albums or facebook_group (action=albums). Returns an end_cursor for the next page. Pricing: 1 credit per call. Inputs: album_id (required), end_cursor (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Facebook page URL, e.g. https://facebook.com/nike. For videos you can pass profile_id instead. Required for: details, id, posts, reels. Optional for: videos. | |
| limit | No | Results per call. posts: 3-9 (default 3) · videos: 6-12 (default 6) · albums: 8-16 (default 8). Optional for: posts, videos, albums. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| album_id | No | Album ID, from action=albums or facebook_group (action=albums). Required for: album_items. | |
| timezone | No | Timezone for timestamps (e.g., UTC, America/New_York). Optional for: posts. | |
| after_time | No | ISO 8601 timestamp - only return posts after this time. Optional for: posts. | |
| end_cursor | No | Pagination cursor from the previous response. Optional for: posts, videos, reels, albums, album_items. | |
| profile_id | No | Numeric Facebook page ID, from action=id. For videos, an alternative to link. Required for: albums. Optional for: videos. | |
| before_time | No | ISO 8601 timestamp - only return posts before this time. Optional for: posts. | |
| exact_followers_count | No | When true, performs a deeper scrape to return the exact follower count (e.g. 38,493,217 instead of "38M"). Charges 5 credits when true, 1 credit otherwise. Default: false. Optional for: details. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the read-only/non-destructive/open-world safety profile, and the description adds a great deal beyond that: per-action credit pricing (including the 5-credit surcharge for exact_followers_count and ceil(posts_returned/3) for posts), per-action return volumes (3-9 posts, 6-12 videos, 8-16 albums), and pagination via end_cursor. The deeper-scrape behavior behind exact_followers_count ('38,493,217 instead of "38M"') is disclosed before the agent spends the credits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded summary sentence followed by one consistently formatted block per action, which is the right structure for a 7-action tool. It is dense with no filler, though the repeated 'Pricing: N credit per call' lines and a few Inputs lines restate what the schema already lists, adding mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, 7-action tool with an output schema, this definition covers everything an agent needs to choose an action, satisfy its parameter requirements, chain calls (id -> albums -> album_items), and anticipate cost and pagination. Return values are described as a bonus even though the output schema already carries them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3, but the description adds workflow semantics the schema cannot express: which parameters each action needs, that profile_id is the numeric ID obtained from action=id, that album_id must come from action=albums or facebook_group, and that link/profile_id are interchangeable for videos. It also explains the effect of after_time/before_time and timezone on the posts action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the resource (Facebook pages) and the data surface (profile details, page ID, posts, videos, reels, photo albums), then enumerates all seven actions with a specific verb+object for each. Sibling boundaries are made explicit: facebook_search (action=pages) to find a page by name, facebook_group (action=albums) as another album_id source, and action=videos vs action=reels vs action=posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Every action carries a when-to-use clause plus a named alternative: 'use it when you have the page URL; to find a page by name, use facebook_search (action=pages) first', 'use action=details for the page's data', 'For reels or videos only, use action=reels or action=videos', 'For long-form videos, use action=videos'. Cross-action dependencies (album_id comes from action=albums, profile_id from action=id) are spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
facebook_postFacebook: PostARead-onlyInspect
Facebook posts, videos and comments: post details, attachments, comments and replies.
Actions:
action=details: Get a Facebook post's text, author, timestamp, media, and reaction, comment and share counts. Start here for any post. If you need view counts, video download URLs or audio metadata (common for reels and videos), use action=details_extended instead. Pricing: 1 credit per call. Inputs: link (required).
action=details_extended: Get everything action=details returns plus view counts, HD/SD video URLs, music/audio metadata and author verification status. Use it for reels and video posts, or when the standard details lack view_count, video_hd_src or attached_track. Pricing: 1 credit per call. Inputs: link (required).
action=id: Extract the numeric post ID from a Facebook post URL. Use it to get the post_id that action=attachments needs. Pricing: 1 credit per call. Inputs: link (required).
action=attachments: List every media attachment (images and videos, with URLs and dimensions) on a Facebook post, including all items in multi-photo posts. Needs the numeric post_id from action=id. For the post's text and engagement, use action=details. Pricing: 5 credits per call (deeper scrape than standard post details). Inputs: post_id (required).
action=video: Get a Facebook video post's metadata: title, message text and hashtags, owner, reactions and view count. Needs the numeric video_id (the number in a facebook.com/.../videos/ URL, or from facebook_page (action=videos)). Pricing: 1 credit per call. Inputs: video_id (required).
action=comments: List top-level comments on a Facebook post or reel, with author, text, timestamp and reaction count. Returns up to 30 per call plus an end_cursor for the next page. Set include_reply_info=true to get the comment_feedback_id and expansion_token that action=comment_replies needs. Pricing: 1 credit per call. Inputs: link (required), limit (optional), end_cursor (optional), include_reply_info (optional).
action=comment_replies: List replies to one Facebook comment. Needs comment_feedback_id and expansion_token, which action=comments returns when called with include_reply_info=true. Pricing: 1 credit per call. Inputs: comment_feedback_id (required), expansion_token (required).
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Facebook post or reel URL (regular posts, video posts and reels). Required for: details, details_extended, id, comments. | |
| limit | No | Maximum number of comments to return. Default: 10. Maximum: 30. Optional for: comments. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| post_id | No | Numeric Facebook post ID, from action=id. Required for: attachments. | |
| video_id | No | Numeric Facebook video ID, e.g. the number in a facebook.com/.../videos/<id> URL. Required for: video. | |
| end_cursor | No | Pagination cursor for next page of comments. Optional for: comments. | |
| expansion_token | No | Expansion token from the comments endpoint with include_reply_info=true. Required for: comment_replies. | |
| include_reply_info | No | When "true", includes comment_feedback_id and expansion_token for fetching replies. Optional for: comments. | |
| comment_feedback_id | No | Feedback ID from the comments endpoint with include_reply_info=true. Required for: comment_replies. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only, open-world, non-destructive behavior, and the description adds substantial context beyond them: per-action credit costs, comment pagination (up to 30 plus end_cursor), token prerequisites, and extra fields returned by details_extended. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a summary and organized as a scannable action list, which suits a seven-action tool. It is somewhat verbose because 'Pricing: 1 credit per call' and 'Inputs:' are repeated for each action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the multi-action complexity, nine-parameter schema, and presence of an output schema, the description covers all operations, required inputs, pagination, prerequisites, and pricing. An agent has enough information to invoke each action correctly without return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all nine parameters and their action-specific requirements. The description reinforces the action-to-parameter mapping and workflow dependencies (e.g. action=id produces post_id for attachments; include_reply_info produces tokens for comment_replies), adding useful consolidation beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence and action breakdown state a specific resource (Facebook posts, videos, comments) and the operations available, so the tool's general purpose is clear. It differentiates its internal actions but does not explicitly distinguish this tool from sibling tools such as facebook_page or facebook_media_download.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action has explicit when-to-use guidance: 'Start here for any post' for details, 'Use it for reels and video posts' for details_extended, and clear prerequisites for attachments and comment_replies. It also names alternatives within the action set, e.g. details_extended when view_count or video_hd_src is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
facebook_searchFacebook: SearchARead-onlyInspect
Search Facebook by keyword: pages, people, posts, videos and locations.
Actions:
action=pages: Find Facebook pages by keyword (brand, business or topic name), optionally near a location. Returns page names, URLs, categories and follower counts, 3 per call, plus an end_cursor. Use it when you don't have the page URL; then call facebook_page (action=details) with a result's URL. For locations, get a location_uid from action=locations. Pricing: 1 credit per call. Inputs: query (required), location_uid (optional), end_cursor (optional).
action=people: Find public Facebook profiles by name or keyword, optionally near a location (location_uid from action=locations). Returns names, profile URLs and pictures, plus work, education and location where public, and an end_cursor. Pricing: 1 credit per call. Inputs: query (required), location_uid (optional), end_cursor (optional).
action=posts: Search public Facebook posts by keyword, optionally filtered by location (location_uid from action=locations) and date range. Returns posts with text, author and engagement, plus an end_cursor. To list one page's posts, use facebook_page (action=posts) instead. Pricing: 1 credit per call. Inputs: query (required), location_uid (optional), start_time (optional), end_time (optional), recent_posts (optional), end_cursor (optional).
action=videos: Search public Facebook videos by keyword, optionally most recent first or live videos only. Returns video titles, URLs and view counts, plus an end_cursor. Pricing: 1 credit per call. Inputs: query (required), most_recent (optional), videos_live (optional), fields (optional), end_cursor (optional).
action=locations: Look up Facebook places by name (city, region, venue) and get their location_uid. The location_uid is only used to filter action=pages, action=people and action=posts; it is not a Marketplace location (use facebook_marketplace (action=city_coordinates) for that). Pricing: 1 credit per call. Inputs: query (required).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search keyword. pages: a brand or business name · people: a name · posts, videos: words in the text · locations: a city, place or landmark. Required for: pages, people, posts, videos, locations. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| fields | No | Comma-separated list of response fields to include. Optional for: videos. | |
| end_time | No | Filter posts before this date (YYYY-MM-DD). Optional for: posts. | |
| end_cursor | No | Pagination cursor. Optional for: pages, people, posts, videos. | |
| start_time | No | Filter posts after this date (YYYY-MM-DD). Optional for: posts. | |
| most_recent | No | When "true", shows most recent videos first. Optional for: videos. | |
| videos_live | No | When "true", filters for live videos only. Optional for: videos. | |
| location_uid | No | Location UID from action=locations, to limit results to a place. Optional for: pages, people, posts. | |
| recent_posts | No | When "true", shows only recent posts. Optional for: posts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/open-world/destructive profile, yet the description adds substantial context beyond them: per-call credit pricing for every action, pagination via end_cursor, the fields each action returns, and the constraint that location_uid only filters pages/people/posts. This is rich, specific behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource list, then structured per action with returns and inputs, which is easy to scan. It loses a point for repeating boilerplate ('Pricing: 1 credit per call' and the input lists) on every action, some of which duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter multi-action tool, the description covers every action's purpose, applicable parameters, return shape, pagination, cost, and cross-tool routing. With annotations and an output schema also present, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including per-action applicability. The description's per-action 'Inputs' lists largely restate what the schema states, so it adds only marginal semantic value over structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (search) and resource (Facebook: pages, people, posts, videos, locations) and enumerates each sub-operation with its own return payload. It clearly distinguishes itself from siblings by naming facebook_page and facebook_marketplace as the tools for adjacent jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routing is explicit and conditional: use facebook_page (action=details) if you lack a page URL, use facebook_page (action=posts) to list one page's posts, and use facebook_marketplace (action=city_coordinates) for Marketplace locations. It also states how actions chain (get location_uid from action=locations first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instagram_locationInstagram: LocationARead-onlyInspect
Instagram locations: posts tagged at a place, and nearby places.
Actions:
action=posts: List Instagram posts tagged at a location: top posts (tab=ranked) or most recent (tab=recent). Needs a location_id, e.g. from a place in instagram_search (action=search). Returns an end_cursor for the next page. Pricing: 1 credit per call. Inputs: location_id (required), tab (optional), end_cursor (optional).
action=nearby: List Instagram places near a given location, with name, category, coordinates and post count. Needs a location_id, e.g. from a place in instagram_search (action=search). Pricing: 1 credit per call. Inputs: location_id (required).
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Filter: "recent" or "ranked". Optional for: posts. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| end_cursor | No | Pagination cursor for next page. Optional for: posts. | |
| location_id | No | Instagram location ID. Required for: posts, nearby. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: per-call pricing (1 credit), pagination via end_cursor, and the shape of nearby results (name, category, coordinates, post count). It does not discuss rate limits or auth requirements, which are the remaining behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action-bulleted layout is front-loaded and easy to scan, and each action states its purpose, inputs, and cost. It loses a point for redundancy: 'Pricing: 1 credit per call' and 'Needs a location_id' are each repeated verbatim across both actions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be exhaustively explained, yet the description still summarizes what nearby returns and flags the pagination cursor for posts. Both actions, their required vs optional parameters, the location_id prerequisite, and cost are all covered, leaving nothing an agent needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the flat schema by mapping parameters to actions ('Inputs: location_id (required), tab (optional), end_cursor (optional)') and by clarifying tab semantics as 'top posts (tab=ranked)' vs 'most recent (tab=recent)', which the schema only labels as 'recent' or 'ranked'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Instagram locations: posts tagged at a place, and nearby places') and breaks the tool into two clearly delineated actions, posts and nearby. It distinguishes itself from siblings by explicitly pointing to instagram_search (action=search) as the source of location_id, so an agent can route between the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action carries its own usage context: posts offers tab=ranked for top posts vs tab=recent for recency, and the prerequisite location_id is named along with where to obtain it (instagram_search action=search). What's missing is explicit when-not guidance, e.g. when to prefer instagram_post over this tool for a single post.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instagram_postInstagram: PostARead-onlyInspect
Instagram posts: full post details, or the shortcode from a post URL.
Actions:
action=details: Get one Instagram post or reel in full: caption, media URLs, engagement counts, timestamp and owner. Needs the shortcode (the part after /p/ or /reel/ in the URL, or from action=id). Pricing: 1 credit per call. Inputs: shortcode (required).
action=id: Extract the shortcode from an Instagram post or reel URL. action=details needs the shortcode. Pricing: 1 credit per call. Inputs: link (required).
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Instagram post URL. Required for: id. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| shortcode | No | Instagram post shortcode (e.g., DMF-GjGO0-q). Required for: details. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered. The description adds real value beyond that: per-call pricing ('1 credit per call'), the specific fields returned for details (caption, media URLs, engagement counts, timestamp, owner), and the accepted shortcode source. No behavioral contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action-by-action structure with Actions/Inputs/Pricing lines is front-loaded and scannable, and every line carries information. It loses a little to redundancy, restating that action=details needs the shortcode in both action entries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both enum actions are covered with required inputs, the chaining between them is explained, and pricing is disclosed. An output schema exists, so return values need not be spelled out, and the description's brief note about the details payload is a bonus rather than a gap-filler.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already states 'Required for: details/id' per parameter, so the baseline is 3. The description goes further by explaining where the shortcode comes from ('the part after /p/ or /reel/ in the URL, or from action=id'), which the schema only partially hints at with an example value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resources per action: 'Get one Instagram post or reel in full' and 'Extract the shortcode from an Instagram post or reel URL'. An agent can tell exactly what each action produces. However, it never distinguishes itself from siblings like instagram_reels or instagram_search, so the boundary between this tool and those is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful internal routing: action=details needs a shortcode, and action=id produces that shortcode from a URL. That is implied workflow guidance rather than explicit when-to-use versus alternatives — there is no indication of when to prefer instagram_reels, instagram_search, or instagram_profile instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instagram_profileInstagram: ProfileARead-onlyInspect
Instagram profiles: details, user ID, posts, reels, highlights and highlight stories.
Actions:
action=details: Get an Instagram profile by username: bio, follower and post counts, verification status and related profiles. Pricing: 1 credit per call. Inputs: username (required), link (optional).
action=id: Resolve an Instagram username or profile URL to its two IDs: user_id (long, e.g. 17841401474538262), used by action=posts and action=reels, and pk (short, e.g. 528817151), used by action=highlights. Pricing: 1 credit per call. Inputs: link (optional), username (optional).
action=posts: List an Instagram profile's posts (photos, videos, carousels) with captions, like and comment counts and media URLs. Pass username (returns more results) or user_id (the long user_id from action=id, not the pk). Returns an end_cursor for the next page. For reels only, use action=reels. Pricing: 1 credit per call. Inputs: username (optional), user_id (optional), end_cursor (optional).
action=reels: List an Instagram profile's reels with play counts, captions, video URLs and audio metadata. Needs the long user_id from action=id (not the pk). Returns an end_cursor for the next page. Pricing: 1 credit per call. Inputs: user_id (required), end_cursor (optional).
action=highlights: List an Instagram profile's story highlights with titles, cover images and highlight IDs. Needs the profile's pk from action=id, passed as user_id (not the long user_id). Use action=highlight_details to get the stories in one highlight. Pricing: 1 credit per call. Inputs: user_id (required).
action=highlight_details: Get the stories inside one Instagram highlight. Needs a highlight_id from action=highlights. Pricing: 1 credit per call. Inputs: highlight_id (required).
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Instagram profile URL (alternative to username). Optional for: details, id. | |
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| user_id | No | Instagram profile ID from action=id. posts, reels: its long user_id (e.g. 17841401474538262) · highlights: its pk (e.g. 528817151). For posts, an alternative to username. Required for: reels, highlights. Optional for: posts. | |
| username | No | Instagram username, without the @. For posts it returns more results than user_id. Required for: details. Optional for: id, posts. | |
| end_cursor | No | Pagination cursor for next page. Optional for: posts, reels. | |
| highlight_id | No | Highlight ID (from profile highlights endpoint). Required for: highlight_details. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld/non-destructive; the description goes well beyond them by disclosing per-call credit pricing, pagination via end_cursor on posts and reels, and the critical trap that highlights need the short pk while posts/reels need the long user_id. That is exactly the operational context an agent cannot get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource then organizes everything as a scannable per-action list, so the length is justified by six actions. The repeated 'Inputs:' lines per action partially duplicate the schema descriptions, which is the only waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-action tool with an output schema present, the description covers what each action returns, its inputs, its pricing and its pagination behavior. Nothing needed to invoke an action correctly is missing, and return-value detail is appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: it explains the two-ID model (user_id vs pk), which action consumes which, that username returns more posts than user_id, and that highlight_id must come from action=highlights. It reinforces rather than merely restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (Instagram profiles) and enumerates the six concrete operations with specific verbs (get details, resolve ID, list posts/reels/highlights, get highlight stories). An agent can distinguish this from siblings like instagram_post, instagram_reels and instagram_search because the description covers the whole profile surface plus highlight stories, which the siblings do not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear in-tool routing: 'For reels only, use action=reels', 'Use action=highlight_details to get the stories in one highlight', and per-action required/optional inputs. It does not, however, tell the agent when to pick this tool over the sibling instagram_post or instagram_reels tools, so sibling differentiation is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instagram_reelsInstagram: ReelsARead-onlyInspect
Instagram Reels: the trending feed, or reels that use a given audio track.
Actions:
action=feed: Get Instagram's recommended and trending reels. Pass clips_media_id from a previous result to continue the feed or get similar reels by the same author. Not tied to a user; for one profile's reels use instagram_profile (action=reels). Pricing: 1 credit per call. Inputs: clips_media_id (optional).
action=by_audio: List Instagram reels that use a given sound. Needs the audio_id (music/audio cluster ID) found in reel results' audio metadata. Pass max_id from the previous response for the next page. Pricing: 1 credit per call. Inputs: audio_id (required), max_id (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Which operation to run. See the tool description for what each action returns and which parameters it needs. | |
| max_id | No | Pagination cursor for next page. Optional for: by_audio. | |
| audio_id | No | Audio cluster ID (music ID). Required for: by_audio. | |
| clips_media_id | No | Clip media ID for chaining/pagination (from previous response). Optional for: feed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/openWorld/destructive, so the bar is lower, yet the description still adds real context: 1-credit pricing per action, pagination chaining via clips_media_id/max_id, and that audio_id comes from reel results' audio metadata. It does not mention auth or rate-limit traits, but the operational disclosure is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line summary, then a clean per-action bullet structure with inputs and pricing. Slightly verbose with repeated pricing lines, but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be restated, and the description covers both actions, their inputs, chaining, and cost. It is complete enough for correct invocation, with only minor room to note result-shape differences between actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining where each ID originates (audio_id from audio metadata, clips_media_id from a previous result) and what each enables (continuing the feed vs. paging results). This adds sourcing semantics beyond the schema's terse field notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise resource (Instagram Reels) and splits it into two clearly-stated operations, feed and by_audio, each with a specific verb and scope. It also distinguishes itself from instagram_profile (action=reels), so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action states its use case and required inputs, and the feed action explicitly excludes the profile case by pointing to instagram_profile (action=reels). The condition selecting each branch is unambiguous, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instagram_searchInstagram: SearchARead-onlyInspect
Search Instagram by keyword and get the top matching users, hashtags and places. Use it to find a username, or a place's location_id for instagram_location (action=posts). Returns an end_cursor for more. Pricing: 1 credit per call. Inputs: keyword (required), end_cursor (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | Search keyword/query | |
| end_cursor | No | Pagination cursor for next page |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | JSON response from the SocialAPIs REST endpoint, unchanged. Object or array depending on the endpoint; most include a `meta` block (statusCode, duration, creditsCharged, creditsRemaining). |
| creditsCharged | No | Credits charged for this call, or null if the endpoint did not report it. |
| creditsRemaining | No | Credits left on the API key after this call, or null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely new operational context: cost ('1 credit per call') and pagination behavior ('Returns an end_cursor for more'), both of which affect how an agent should budget and loop calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then intent, then cost and pagination — dense and mostly well-ordered. The trailing 'Inputs:' sentence duplicates the schema verbatim and earns little, a minor but real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, intended use, cost, pagination, and the shape of results, and an output schema exists so return values needn't be detailed. Adequate for a 2-parameter, low-complexity search tool; only the redundant parameter recap and lack of exclusions keep it from 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The 'Inputs: keyword (required), end_cursor (optional)' line merely restates the schema and adds no syntax, format, or usage nuance beyond it, matching the baseline for fully-documented params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search Instagram by keyword') and enumerates the three result types (users, hashtags, places). It also differentiates itself from siblings by naming instagram_location and the action=posts flow, so an agent can route without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering intents: find a username, or resolve a place's location_id for instagram_location (action=posts). That is clear when-to-use guidance tied to a downstream tool. It does not state when-not-to-use (e.g. vs instagram_profile lookup by known handle), so it falls short of the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
59 tool updates
v1.0.5- Added
facebook_ads - Removed
facebook_ads_archive_details - Removed
facebook_ads_countries - Removed
facebook_ads_keywords - Removed
facebook_ads_page_details - Removed
facebook_ads_search - Removed
facebook_download_media - Removed
facebook_get_comment_replies - Removed
facebook_get_group_details - Removed
facebook_get_group_id - Removed
facebook_get_group_metadata - Removed
facebook_get_group_posts - Removed
facebook_get_group_videos - Removed
facebook_get_page_details - Removed
facebook_get_page_id - Removed
facebook_get_page_posts - Removed
facebook_get_page_reels - Removed
facebook_get_page_videos - Removed
facebook_get_post_attachments - Removed
facebook_get_post_comments - Removed
facebook_get_post_details - Removed
facebook_get_post_id - Removed
facebook_get_video_details - Added
facebook_group - Added
facebook_marketplace - Removed
facebook_marketplace_categories - Removed
facebook_marketplace_city_coordinates - Removed
facebook_marketplace_listing - Removed
facebook_marketplace_rentals - Removed
facebook_marketplace_search - Removed
facebook_marketplace_seller - Removed
facebook_marketplace_vehicles - Added
facebook_media_download - Added
facebook_page - Added
facebook_post - Added
facebook_search - Removed
facebook_search_locations - Removed
facebook_search_pages - Removed
facebook_search_people - Removed
facebook_search_posts - Removed
facebook_search_videos - Removed
instagram_get_highlight_details - Removed
instagram_get_location_posts - Removed
instagram_get_nearby_locations - Removed
instagram_get_post_details - Removed
instagram_get_post_id - Removed
instagram_get_profile_details - Removed
instagram_get_profile_highlights - Removed
instagram_get_profile_posts - Removed
instagram_get_profile_reels - Removed
instagram_get_reels_by_audio - Removed
instagram_get_reels_feed - Removed
instagram_get_user_id - Added
instagram_location - Removed
instagram_popular_search - Added
instagram_post - Added
instagram_profile - Added
instagram_reels - Added
instagram_search
47 tool updates
v1.0.1- First observed
facebook_ads_archive_details - First observed
facebook_ads_countries - First observed
facebook_ads_keywords - First observed
facebook_ads_page_details - First observed
facebook_ads_search - First observed
facebook_download_media - First observed
facebook_get_comment_replies - First observed
facebook_get_group_details - First observed
facebook_get_group_id - First observed
facebook_get_group_metadata - First observed
facebook_get_group_posts - First observed
facebook_get_group_videos - First observed
facebook_get_page_details - First observed
facebook_get_page_id - First observed
facebook_get_page_posts - First observed
facebook_get_page_reels - First observed
facebook_get_page_videos - First observed
facebook_get_post_attachments - First observed
facebook_get_post_comments - First observed
facebook_get_post_details - First observed
facebook_get_post_id - First observed
facebook_get_video_details - First observed
facebook_marketplace_categories - First observed
facebook_marketplace_city_coordinates - First observed
facebook_marketplace_listing - First observed
facebook_marketplace_rentals - First observed
facebook_marketplace_search - First observed
facebook_marketplace_seller - First observed
facebook_marketplace_vehicles - First observed
facebook_search_locations - First observed
facebook_search_pages - First observed
facebook_search_people - First observed
facebook_search_posts - First observed
facebook_search_videos - First observed
instagram_get_highlight_details - First observed
instagram_get_location_posts - First observed
instagram_get_nearby_locations - First observed
instagram_get_post_details - First observed
instagram_get_post_id - First observed
instagram_get_profile_details - First observed
instagram_get_profile_highlights - First observed
instagram_get_profile_posts - First observed
instagram_get_profile_reels - First observed
instagram_get_reels_by_audio - First observed
instagram_get_reels_feed - First observed
instagram_get_user_id - First observed
instagram_popular_search
TDQS
Scored across 12 tools
The 12 top-level tools are mostly cleanly partitioned by platform and entity, so an agent can usually choose correctly from the name alone. However, several tools expose overlapping action concepts such as posts, videos, albums and ID resolution across page, group, post and search tools, so descriptions are still needed to avoid misselection.
Tool names consistently follow a platform_entity snake_case pattern: facebook_* and instagram_* throughout. The action values are also snake_case, even though their semantics vary between nouns, verbs and qualifiers.
Twelve top-level tools is well within a reasonable range for a server covering both Facebook and Instagram public data. Each top-level tool corresponds to a meaningful resource family, and the multi-action bundling keeps the tool count manageable.
The surface covers a broad range of public Facebook and Instagram data: pages, groups, posts, videos, reels, albums, marketplace, ads, search, locations and media download. Minor gaps remain, such as Instagram hashtag post feeds and Instagram comments/replies, plus limited Facebook group discovery beyond URL-based lookup.
Maintenance
Related MCP Connectors
- ZoosialOAuthcom.zoosial
Social media API for AI agents: publish, DMs, comments, Meta ads and leads.
Social media data for AI agents: creators, posts, comments, insights, trending across 6 platforms.
Agent-first social media publishing, scheduling, analytics, and unified inbox API + 16-tool MCP server across 18 social platforms (X, LinkedIn, Instagram, YouTube, TikTok, Threads, Bluesky, Reddit, Telegram, Discord, Mastodon, Facebook, Pinterest).
Instagram for AI agents: publish, read comments and DMs, insights, and engage from your account.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage a Facebook Fanpage via the official Graph API, supporting posting, scheduling, comment moderation, and analytics, without scraping or accessing private messages.MIT
- AlicenseNot gradedqualityDmaintenanceAutomates Facebook Page management via Graph API, enabling posting, comment moderation, and analytics through AI agents.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to automate Facebook Page management including posting, commenting, and analytics via the Facebook Graph API.MIT
- AlicenseAqualityDmaintenanceExposes 10 tools to manage Facebook Pages, Posts, Comments, Ad Accounts, Campaigns, Insights, and execute any raw Graph API request from AI coding assistants.10MIT