pexels-mcp-server
Provides tools for searching and fetching Pexels photos, videos, and collections, including curated photos, popular videos, and collection media.
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., "@pexels-mcp-serversearch for photos of a sunset over the ocean"
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.
pexels-mcp-server
A production-ready Model Context Protocol (MCP) server for the Pexels API. It gives AI assistants — Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, and any MCP client — tools to search and fetch Pexels photos, videos, and collections, covering every endpoint the Pexels API documents.
Unofficial project. This is not affiliated with, endorsed by, or sponsored by Pexels. "Pexels" is a trademark of its respective owner. You use it under your own Pexels API account and are responsible for complying with the Pexels License.
Table of contents
Related MCP server: pexels-mcp-server
Features
9 tools covering every documented Pexels endpoint — photos (search, curated, get), videos (search, popular, get), and collections (featured, media, mine). Pexels has a single API-key auth tier and no write endpoints, so there's no partial "read-only v1" — this is the whole surface.
License-aware by design — Pexels doesn't require attribution, but every photo still returns a ready-to-use courtesy
credit(text + HTML), and the server's instructions steer the model around the license restrictions that do apply (no resale of unaltered content, no redistribution to other stock platforms, no trademark/logo use, no implied endorsement).Real image & video URLs — each photo returns Pexels' own pre-sized
srcURLs (original/large2x/large/medium/small/portrait/landscape/tiny); each video returns itsvideo_filesrenditions (trimmed to the highest-resolution few in list results, complete on a single-item lookup).Token-efficient output — full Pexels responses are trimmed to a compact shape (URLs + metadata as text, never base64 blobs) to keep model context small.
Robust — typed failures returned as MCP
isErrorresults the model can recover from, plus retries/backoff, timeouts, and rate-limit-aware quota short-circuiting (Pexels omits its rate-limit headers on a429, so the client caches the last-known reset time instead of guessing).Safe — API-key redaction in all error output, and untrusted-text handling guidance for indirect prompt-injection defence.
Lean & modern — ESM, Node 20+, zero-install via
npx, no telemetry.
Quick start
1. Get a Pexels API key
Create a free account at pexels.com/api and you'll receive an API key instantly — no app review, no approval wait.
2. Add the server to your MCP client
Claude Desktop — edit claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"pexels": {
"command": "npx",
"args": ["-y", "@hanoak/pexels-mcp-server"],
"env": {
"PEXELS_API_KEY": "your_api_key"
}
}
}
}Restart the client. See Configuration for every supported variable.
Claude Code (CLI):
claude mcp add pexels \
--env PEXELS_API_KEY=your_api_key \
-- npx -y @hanoak/pexels-mcp-serverCursor — ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project): use the exact same mcpServers block as Claude Desktop above.
Windsurf — ~/.codeium/windsurf/mcp_config.json: same mcpServers block as Claude Desktop above.
VS Code — .vscode/mcp.json (note the top-level key is servers, not mcpServers):
{
"servers": {
"pexels": {
"command": "npx",
"args": ["-y", "@hanoak/pexels-mcp-server"],
"env": {
"PEXELS_API_KEY": "your_api_key"
}
}
}
}Any other MCP client — run the server over stdio with:
PEXELS_API_KEY=your_api_key npx -y @hanoak/pexels-mcp-serverPoint your client's stdio transport at command: npx, args: ["-y", "@hanoak/pexels-mcp-server"], and pass the key via env.
3. Try it
Restart your client and ask:
"Find me a photo of mountains on Pexels."
Example interaction
A typical flow: the model calls pexels_search_photos, picks a result, and presents the image with its courtesy credit.
You: Find a landscape photo of a foggy pine forest.
Assistant: (calls
pexels_search_photoswithquery: "foggy pine forest",orientation: "landscape", picks the best result) Here's a great match — photo by Jane Doe on Pexels — along with the image URL and a ready-to-use credit line.
Each tool returns a compact JSON payload. Here's the shape of a single photo result (illustrative values):
{
"photo": {
"id": 1103970,
"alt": "Photography of Trees at Foggy Forest",
"width": 4000,
"height": 2667,
"avg_color": "#3E361F",
"url": "https://www.pexels.com/photo/photography-of-trees-at-foggy-forest-1103970/",
"src": {
"original": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg",
"large2x": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
"large": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
"medium": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&h=350",
"small": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&h=130",
"portrait": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=1200&w=800",
"landscape": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=627&w=1200",
"tiny": "https://images.pexels.com/photos/1103970/pexels-photo-1103970.jpeg?auto=compress&cs=tinysrgb&dpr=1&fit=crop&h=200&w=280"
},
"photographer": {
"name": "Jane Doe",
"url": "https://www.pexels.com/@janedoe",
"id": 42
},
"credit": {
"text": "Photo by Jane Doe on Pexels",
"html": "Photo by <a href=\"https://www.pexels.com/@janedoe\">Jane Doe</a> on <a href=\"https://www.pexels.com\">Pexels</a>"
}
},
"rate_limit": { "limit": 200, "remaining": 199, "resetEpoch": 1755000000 }
}Every tool result includes a rate_limit object (limit, remaining, resetEpoch) read from the Pexels response headers. List/search tools wrap results in photos/videos/collections/media arrays with pagination fields (total_results, page, per_page, has_next_page).
Configuration
Configuration is entirely via environment variables — no config files, no flags for secrets.
Environment variable | Required | Description |
| yes | Your Pexels API key. The server exits at startup with a clear message if it is missing or blank. |
| no |
|
CLI flags: --version and --help are supported (e.g. npx @hanoak/pexels-mcp-server --version).
Tools
All tools are namespaced pexels_* and every one is read-only (readOnlyHint: true) — Pexels' API has no write endpoints, so a client can safely auto-approve the entire server. per_page is clamped to a max of 80 (Pexels' own documented max), and page is 1-based.
Domain | Tools |
Photos |
|
Videos |
|
Collections |
|
Tool reference
Tool | Parameters | Description |
|
| Keyword photo search with filters. |
|
| Pexels' hand-curated photo picks, refreshed hourly. |
|
| A single photo by its numeric ID, full detail. |
Tool | Parameters | Description |
|
| Keyword video search with filters. |
|
| Currently popular videos, optionally filtered by size/duration. |
|
| A single video by its numeric ID — returns every rendition, not just the top few. |
Tool | Parameters | Description |
|
| Pexels' featured collections (metadata only). |
|
| Collections belonging to the account that owns the configured API key (see FAQ). |
|
| The photos/videos inside a collection, each tagged with |
Output shape
Tools return trimmed, token-efficient JSON rather than raw Pexels responses:
Photos →
id,alt,width/height,avg_color,url,src(all 8 Pexels sizes),photographer, and a courtesycreditobject.Videos →
id,url,image,width/height,duration,user,video_files(trimmed to the top 5 by resolution in list results; complete onpexels_get_video),video_files_count,preview_picture,video_pictures_count.Collections →
id,title,description,private,media_count,photos_count,videos_count.Every result carries a
rate_limit(limit,remaining,resetEpoch); lists/searches add pagination fields (total_results,page,per_page,has_next_page).
Resources & prompts
Beyond tools, the server also exposes:
Resources — a compact guide your client can pull in as context:
pexels://guides/usage— the license restrictions that apply, the optional courtesy-credit convention, and content-safety notes.
Prompts — ready-made tasks your client can surface directly; each expands into a guided, multi-step tool-calling task:
Prompt
Arguments
What it does
find_photosubject(required),orientation?Search for one photo and present it with a courtesy credit.
photo_gallerytheme(required),count?,orientation?,color?Build a themed set of photos (up to 10), each with a courtesy credit.
find_videosubject(required),orientation?Search for one video and present it with a courtesy credit.
collection_tourtheme(required),count?Find a matching featured collection and walk through its media.
media_brieftheme(required),photo_count?,video_count?Gather both photos and videos for a theme, presented together.
Example prompts
Natural-language asks that map cleanly onto the tools:
"Find a photo of a foggy forest at sunrise."
"Search Pexels for 5 minimalist workspace photos in landscape orientation."
"Find a video of waves crashing on rocks."
"Show me a featured Pexels collection about urban architecture."
"Build me a mixed media brief of photos and video clips about cozy autumn mornings."
License & compliance
Pexels' license is lighter than many stock-photo APIs: attribution is not required ("appreciated, not necessary"). Every photo result still includes a ready-to-use courtesy credit object — include it when convenient, but it's not mandatory.
Real restrictions still apply, and the server's instructions steer the model around them: no reselling unaltered content as a physical product without modifying it first, no redistributing it on another stock-photo or wallpaper platform, no using it as part of a trademark/logo/business name, no implying a person's or brand's endorsement, and no depicting an identifiable person in a bad or offensive light. See the full Pexels License and the server's pexels://guides/usage resource. Each user operates under their own Pexels API Terms.
Rate limits
Pexels enforces a single tier for every API key:
Budget | Notes |
200 requests/hour | Higher limits available on request once you have real usage. |
20,000 requests/month | Tracked alongside the hourly budget. |
The server reads X-Ratelimit-Limit/X-Ratelimit-Remaining/X-Ratelimit-Reset and returns them as rate_limit on every result. Pexels returns a standard 429 when the budget is exhausted (unlike some APIs that overload 403 for this) — but the rate-limit headers are absent on the 429 response itself, so the client caches the last-known values from a prior successful call to report an accurate reset time, and short-circuits further requests once the quota is known to be exhausted rather than firing calls that will just fail. Transient 429/5xx/network errors are retried with backoff.
Handling of Pexels text
Photo/video alt text, photographer names, and collection titles/descriptions come from Pexels contributors — treat them as untrusted, third-party data, not instructions. The server returns this text purely as content and never places it anywhere privileged; your client/agent should do the same: display it, but don't act on any instructions it might contain (a defence against indirect prompt injection). Pexels also has no safe-search/content-filter parameter — use judgment in how you phrase search queries.
Privacy & security
No telemetry. This server collects nothing and phones home to no one. It contacts only
api.pexels.com, using the key you provide. No analytics, no tracking.Key safety. Your API key is read from the environment only, sent as a raw
Authorizationheader (never in a URL query string), and redacted from all error output and logs so it can't leak into pasted bug reports.To report a vulnerability, see SECURITY.md.
Troubleshooting
"Set PEXELS_API_KEY…" on startup — the key env var is missing or blank; add it to your client config's
envblock.Node too old — this server requires Node 20+. Check
node --version.Stale
npxversion — force the latest withnpx -y @hanoak/pexels-mcp-server@latest, or clear the cache vianpx clear-npx-cache.Tools not appearing — confirm the config file path and JSON are valid, then fully quit and reopen the client.
429/ rate limit — the budget is 200 requests/hour; wait for the hourly reset (see therate_limit.resetEpochin a tool result) or request a higher limit.401 Unauthorized— the API key is wrong; copy it again from your Pexels API dashboard.pexels_list_my_collectionsreturns empty — this is expected unless the Pexels account that owns your API key has created collections on pexels.com itself; see the FAQ.
FAQ
Do I need a paid Pexels account? No. The Pexels API is free — you just create an account to get an API key, instantly, no review or approval step.
Does it download or rehost images/videos? No. It returns Pexels-hosted URLs (hotlink them directly) and never rehosts or returns base64 blobs.
Why does pexels_list_my_collections come back empty?
Pexels has no per-conversation login — the tool always reflects the collections of whichever Pexels account owns the configured API key, not the person chatting. It'll be empty unless that specific account has created collections on pexels.com.
Does it work outside Claude? Yes — it's a standard stdio MCP server. See the client setup section for Claude Code, Cursor, VS Code, Windsurf, and generic stdio.
Requirements
Node.js >= 20 (Node 18 is end-of-life).
A Pexels API key.
Compatibility
Component | Supported |
Node.js | 20 and 22, tested in CI; |
OS | Linux, macOS, and Windows (all tested in CI). |
MCP SDK |
|
Transport | stdio (HTTP/SSE may be added in a future release). |
Roadmap
Full detail lives in docs/ROADMAP.md. In short: v1 covers the entire documented Pexels API in one release — there's no OAuth tier to split a v2 behind, unlike some other stock-photo MCP servers. Future scope under consideration includes structured tool output for video renditions, a short-TTL response cache if real quota pressure appears, and additional prompts/resources.
Changes are tracked in CHANGELOG.md; the project follows Semantic Versioning.
Contributing
Contributions are welcome — see CONTRIBUTING.md and our Code of Conduct. It covers local setup, the test suite, testing tools by hand with the MCP Inspector, and the versioning/deprecation policy. To report a vulnerability, see SECURITY.md.
Contact & community
Maintained by Hanoak S. The fastest way to get help or propose a feature is to open an issue — it's public, searchable, and helps the whole community.
If this project helps you, a ⭐ on GitHub is appreciated — it aids discoverability for others looking for a Pexels MCP server.
License
MIT © Hanoak S. Not affiliated with Pexels.
Available Tools
9 toolspexels_curated_photosCurated Pexels PhotosARead-only
List Pexels' hand-curated photo picks, refreshed hourly (paginated). Returns compact photo objects. Read-only. Each photo includes several pre-sized URLs in src (original/large2x/large/medium/small/portrait/landscape/tiny) — pick the closest fit rather than always using original.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| per_page | No | Items per page (clamped to a max of 80). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'Read-only' is redundant but reinforces safety. However, it adds valuable behavioral context: the hourly refresh, pagination, and the URL structure guidance ('pick the closest fit rather than always using original'). No contradictions.
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 two sentences with zero fluff. The first sentence states the core function, and the second sentence provides a concise, actionable detail about URL sizes. Every word earns its place.
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 simple list tool with no output schema, the description covers return values ('compact photo objects'), pagination, refresh rate, and provides useful details about the `src` object. It lacks only minor aspects like error handling or rate limits, but these are not critical for such a straightforward tool.
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%, with both parameters (page, per_page) clearly described. The description adds no new parameter-specific semantics beyond mentioning pagination, which is already implied by the schema and parameter names. 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 description clearly states the tool's purpose with a specific verb ('List'), resource ('Pexels' hand-curated photo picks'), and adds distinctive details ('refreshed hourly', 'paginated'). This differentiates it from sibling tools like pexels_search_photos and pexels_get_photo by emphasizing the 'curated' nature.
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 clear context for when to use the tool (when you want curated content, not search results), though it doesn't explicitly name alternatives or exclusions. The note about picking the closest URL size is a practical usage guideline for the output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_get_collection_mediaGet Pexels Collection MediaARead-only
Get the photos and/or videos inside a Pexels collection by its ID (paginated, optionally filtered to just photos or just videos). Each item is returned in the same compact shape its own domain tool would use, tagged with media_type. Read-only. Each photo includes several pre-sized URLs in src (original/large2x/large/medium/small/portrait/landscape/tiny) — pick the closest fit rather than always using original. video_files is trimmed to the highest-resolution renditions (see video_files_count for the full count) — call pexels_get_video for the complete rendition list on one video.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The Pexels collection ID. | |
| page | No | Page number, 1-based. | |
| sort | No | Sort order. | |
| type | No | Filter media by type. Omit to return both photos and videos. | |
| per_page | No | Items per page (clamped to a max of 80). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses pagination, optional type filtering, compact shape with media_type tag, pre-sized URL options, and that video_files is trimmed while video_files_count gives the full count. This is valuable behavioral detail that cannot be inferred from annotations alone.
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?
Five sentences, each carrying substantive information. The first sentence front-loads the core purpose, and subsequent sentences add practical details about output shape and URL usage. It is somewhat dense but every sentence earns its place, with no repetition or filler.
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 no output schema, the description thoroughly covers what the caller needs to know: return shape (compact, media_type-tagged), how to choose src URLs, video rendition trimming, and the alternative tool for full data. Pagination and filtering are mentioned, making it complete for a read-only list operation.
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?
The input schema is fully described (100% coverage), so the baseline is 3. The description adds a little by mentioning filtering to 'just photos or just videos' and the pagination nature, but it doesn't go beyond what the schema already states for each parameter.
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 begins with a specific verb 'Get' and clearly identifies the resource: photos and/or videos inside a Pexels collection by its ID. This distinguishes it from sibling tools like search or list-collection tools, which focus on discovery or collection metadata.
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 sets clear context for when to use this tool (when you have a collection ID and want its media) and explicitly directs users to pexels_get_video for complete rendition lists, demonstrating awareness of alternative tools. It doesn't enumerate exclusions (e.g., when not to use), but provides sufficient practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_get_photoGet Pexels PhotoARead-only
Get a single Pexels photo by its numeric ID, with full detail, pre-sized URLs, and a courtesy credit. Read-only. Each photo includes several pre-sized URLs in src (original/large2x/large/medium/small/portrait/landscape/tiny) — pick the closest fit rather than always using original.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The numeric Pexels photo ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint, but the description adds value by disclosing the response structure (src field with named pre-sized URLs) and offering guidance on choosing the closest fit. This goes beyond the annotations and gives actionable behavioral context.
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 concise, with two short sentences that front-load the purpose and then provide practical guidance on URL selection. No wasted words or redundant fluff.
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 simple single-parameter read-only tool, the description adequately covers return content, usage tip, and safety (via annotations). Although no output schema exists, the description highlights key response aspects like src sizes and courtesy credit, making it complete for the task.
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?
The input schema fully documents the single id parameter with type, bounds, and a clear description, so coverage is 100%. The description only restates 'numeric ID' and does not add new parameter semantics. The baseline of 3 applies due to complete schema coverage.
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 clearly states the tool retrieves a single Pexels photo by its numeric ID, with specific return details (pre-sized URLs, courtesy credit). It is distinct from sibling search/curated/list tools, which focus on multiple results or collections.
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 implies use when you already have a specific photo ID and need full details. It does not explicitly mention alternatives or when-not-to-use, but the singular 'get by ID' scope makes the context clear. Without explicit exclusions, it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_get_videoGet Pexels VideoARead-only
Get a single Pexels video by its numeric ID, with full detail and every available rendition (unlike the search/popular tools, this returns the complete video_files list, not just the top few). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The numeric Pexels video ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint, and the description redundantly says 'Read-only.' However, it adds meaningful behavioral context beyond annotations: that the response includes every available rendition and the complete video_files list, not just a truncated subset. This is useful and not inferable from 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?
Two sentences, front-loaded with purpose and differentiator, and no wasted words. The read-only mention is redundant but short. Highly concise and well-structured.
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 simple single-parameter get operation with no output schema, the description sufficiently covers the return behavior (full detail, complete video_files list), the key differentiator from siblings, and the read-only nature. Nothing critical is missing given the low complexity.
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% with the id parameter fully described as 'The numeric Pexels video ID.' The description reinforces this as 'numeric ID' but adds no new meaning beyond the schema. Baseline of 3 applies for high schema coverage.
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 clearly states it gets a single Pexels video by numeric ID, and explicitly contrasts with search/popular tools by noting it returns the complete video_files list. This distinguishes it from siblings and clearly specifies the resource and scope.
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?
It indicates when to use this tool by contrasting with search/popular tools ('unlike the search/popular tools... returns the complete list'), implying use when a specific video ID is known and full detail is needed. It does not explicitly mention when not to use it or name sibling alternatives directly, but the differentiation is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_list_featured_collectionsList Featured Pexels CollectionsARead-only
List Pexels' featured collections (paginated). Returns collection metadata only — call pexels_get_collection_media for the photos/videos inside one. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| per_page | No | Items per page (clamped to a max of 80). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, so read-only behavior is covered. The description adds value beyond annotations by stating it 'Returns collection metadata only' and is 'paginated', which are behavioral specifics not captured in the annotations. This is informative without being redundant.
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 two sentences long, front-loaded with the core purpose, then includes an alternative, and ends with 'Read-only'. Every sentence adds essential information with zero fluff. It is concise and well-structured for quick scanning by an AI agent.
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 tool has only two optional parameters fully documented in the schema, no output schema, and annotations covering read-only and open-world hints, the description is complete. It states the resource (featured collections), the scope (metadata only), the pagination behavior, and the path to get media—addressing all likely follow-up needs without requiring extra inference.
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?
The schema fully describes both parameters (page and per_page) with clear descriptions and defaults (100% coverage). The description mentions 'paginated' but does not add any additional meaning to the parameters beyond what the schema provides. Baseline of 3 is appropriate since the schema carries the explanatory weight.
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 clearly states the tool lists 'Pexels' featured collections' and specifies it is 'paginated'. It distinguishes from siblings by noting it returns 'collection metadata only', which separates it from pexels_get_collection_media and pexels_list_my_collections (featured vs. my). The verb 'list' makes the action unambiguous.
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 provides an explicit alternative: 'call pexels_get_collection_media for the photos/videos inside one', telling users exactly when to use a different tool. It also implies this tool is for collection metadata rather than media, giving clear usage context. The 'Read-only' note further guides safe usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_list_my_collectionsList My Pexels CollectionsARead-only
List the collections belonging to the Pexels account that owns the configured API key (paginated). Since Pexels has no per-conversation OAuth login, this always reflects the API key's own account, not the person chatting — it will be empty unless that account has created collections on pexels.com. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| per_page | No | Items per page (clamped to a max of 80). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds meaningful behavioral context: the account-ownership semantics, the lack of per-conversation OAuth, and the possible empty result. It also explicitly states 'Read-only', reinforcing the annotation without contradicting it.
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?
Two sentences, front-loaded with the core purpose and pagination, followed by a necessary clarification about account ownership and emptiness. Every sentence earns its place; no wasted words.
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?
The tool is simple, has no output schema, and parameters are fully documented in the schema. The description fully covers the tool's context: account ownership, pagination, potential empty result, and read-only nature. Nothing critical is missing for an agent to select and invoke it 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% for both parameters, with descriptions for 'page' and 'per_page' already explaining their meaning and defaults. The description only adds the word 'paginated', which adds minimal value beyond the schema. 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 description uses a specific verb ('List') and a specific resource ('collections belonging to the Pexels account that owns the configured API key'), clearly distinguishing it from siblings like pexels_list_featured_collections. It also adds pagination scope, making the purpose unambiguous.
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 provides clear context: this tool reflects the API key's own account, not the chatting user, and may be empty without created collections. This implies when to use it (for personal collections) but does not explicitly name alternative tools or provide when-not-to-use exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_popular_videosPopular Pexels VideosARead-only
List currently popular Pexels videos, optionally filtered by minimum width/height and duration range. Returns compact video objects. Read-only. video_files is trimmed to the highest-resolution renditions (see video_files_count for the full count) — call pexels_get_video for the complete rendition list on one video.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| per_page | No | Items per page (clamped to a max of 80). | |
| min_width | No | Minimum video width in pixels. | |
| min_height | No | Minimum video height in pixels. | |
| max_duration | No | Maximum video duration in seconds. | |
| min_duration | No | Minimum video duration in seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that video_files are trimmed to highest-resolution renditions and mentions video_files_count, and notes 'Returns compact video objects' – adding behavioral context beyond the readOnlyHint annotation.
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 sentences are packed with purpose, filters, response format, and an alternative tool reference; no filler words.
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?
Despite no output schema, the description explains response compactness, the trimming behavior, and where to get full renditions, covering the important behavioral aspects for a list tool.
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?
Input schema covers 100% of parameters with descriptions; the description only groups them as 'minimum width/height and duration range' without adding new semantics, so baseline score of 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?
The description uses the specific verb 'List' with the resource 'currently popular Pexels videos' and further specifies optional filters, distinguishing it from sibling tools like search_videos and curated_photos.
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?
It explicitly directs users to call pexels_get_video when complete rendition lists are needed, and states the tool is read-only, providing clear guidance on when to use this tool versus an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_search_photosSearch Pexels PhotosARead-only
Search Pexels for photos matching a query, with optional orientation/size/color/locale filters. Returns compact photo objects with pre-sized URLs and a courtesy credit (attribution is appreciated but not required by the Pexels license). Read-only. Each photo includes several pre-sized URLs in src (original/large2x/large/medium/small/portrait/landscape/tiny) — pick the closest fit rather than always using original.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| size | No | Minimum photo size: large (24MP), medium (12MP), or small (4MP). | |
| color | No | Desired photo color: a named color (red, orange, yellow, green, turquoise, blue, violet, pink, brown, black, gray, white) or a hex code like "#ffffff". | |
| query | Yes | The search query, e.g. "ocean", "tigers", "pears". | |
| locale | No | The locale of the search, e.g. "en-US", "fr-FR" (28 supported locales). | |
| per_page | No | Items per page (clamped to a max of 80). | |
| orientation | No | Desired photo orientation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, and the description reinforces 'Read-only'. It adds valuable behavior beyond annotations: returns pre-sized URLs with specific size options, mentions courtesy credit/license terms, and advises picking the closest fit rather than always using 'original'. This enriches the agent's understanding of response behavior.
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 concise and front-loaded: first sentence states the core purpose, second explains return format and licensing, third gives specific usage guidance on URL selection. Every sentence earns its place, with no fluff or repetition.
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 no output schema, the description sufficiently explains return values (compact photo objects with pre-sized URLs and credit). It covers key usage guidance and licensing. It does not mention pagination metadata or total result counts, but the schema describes page/per_page, so the agent can infer. This is nearly complete for a search tool.
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 mentions the optional filters (orientation/size/color/locale) but does not add semantic detail beyond the schema's own parameter descriptions. It does not clarify parameter usage beyond grouping them as filters.
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 clearly states the tool's purpose: 'Search Pexels for photos matching a query' with specific verb and resource. It distinguishes from siblings by emphasizing query-based search vs. curated photos or single photo retrieval, and lists optional filters.
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 establishes clear context: use this tool to search photos by query with optional filters. It does not explicitly mention alternatives or when-not-to-use, but the context is sufficiently clear for an agent to select it for search tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pexels_search_videosSearch Pexels VideosARead-only
Search Pexels for videos matching a query, with optional orientation/size/locale filters. Returns compact video objects with rendition links. Read-only. video_files is trimmed to the highest-resolution renditions (see video_files_count for the full count) — call pexels_get_video for the complete rendition list on one video.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| size | No | Minimum video size: large (4K), medium (Full HD), or small (HD). | |
| query | Yes | The search query, e.g. "ocean", "tigers", "pears". | |
| locale | No | The locale of the search, e.g. "en-US", "fr-FR" (28 supported locales). | |
| per_page | No | Items per page (clamped to a max of 80). | |
| orientation | No | Desired video orientation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals important behavioral details: it returns compact video objects, trims video_files to highest-resolution renditions, and references video_files_count for the full count. It also directs users to pexels_get_video for complete data, which adds transparency about data limits not evident from 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 two sentences, front-loaded with the core purpose, and each clause adds value: the filter list, return format, read-only note, and important trimming behavior. There is no wasted wording or duplication of schema details.
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 no output schema present, the description adequately explains what the tool returns (compact video objects with rendition links) and clarifies a critical data transformation (trimmed video_files). It also gives a cross-reference to pexels_get_video for complementary data, making the tool's behavior sufficiently complete for selection and invocation.
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?
The input schema already covers all six parameters with detailed descriptions (e.g., size enum, page defaults, locale examples), achieving 100% schema coverage. The description only summarizes these as 'optional orientation/size/locale filters' without adding new meanings; thus the baseline of 3 is appropriate since 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 clearly states 'Search Pexels for videos matching a query' along with optional filters, making the tool's purpose specific and unambiguous. It distinguishes itself from sibling tools like pexels_search_photos by focusing on videos and from pexels_get_video by indicating it is a search operation.
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 provides clear context for when to use this tool—when searching videos by query—and explicitly names pexels_get_video as the alternative for retrieving the complete rendition list for a single video. It does not explicitly exclude other search variants like pexels_popular_videos, but the query-based filtering makes the usage context clear.
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.
9 tool updates
v1.0.0- First observed
pexels_curated_photos - First observed
pexels_get_collection_media - First observed
pexels_get_photo - First observed
pexels_get_video - First observed
pexels_list_featured_collections - First observed
pexels_list_my_collections - First observed
pexels_popular_videos - First observed
pexels_search_photos - First observed
pexels_search_videos
TDQS
Scored across 9 tools
Each tool maps to a distinct resource and action: photos, videos, and collections each have dedicated search/list/get operations with no overlapping responsibilities. The separation between curated photos and popular videos, and between featured vs. my collections, is clear.
All tools follow a consistent pexels_<verb>_<resource> pattern, e.g., pexels_search_photos, pexels_get_video, pexels_list_featured_collections. The verb-noun structure is uniform and predictable across the entire server.
Nine tools provide a well-scoped surface for the Pexels API, covering the three main domains (photos, videos, collections) without bloat. Each tool fills a clear functional niche, and the count is within the ideal range.
The server covers the full read-only lifecycle: search, curated/popular listings, individual item retrieval, and collection browsing. There are no obvious dead ends, and the only missing operation (upload) is not part of the Pexels API.
Maintenance
Related MCP Connectors
MCP server for Pixapi: check live credit pricing and balance, then generate images and video.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server for searching and retrieving photos from Unsplash with proper attribution, designed for LLMs building content pages.326MIT
- AlicenseAqualityCmaintenanceAn MCP server that enables AI agents to search, retrieve, and curate free stock photos and videos from Pexels, with tools, resources, and prompts for easy integration.8MIT
- AlicenseAqualityFmaintenanceAn MCP server that enables AI assistants to search for royalty-free images from Pexels and Unsplash using natural language, returning structured results with metadata.529 npmMIT
- AlicenseAqualityCmaintenanceAn MCP server for the Pexels API that provides inline visual previews, video storyboards, and batch operations for efficient stock media selection in Claude and other MCP clients.13MIT