Gravatar MCP Server
OfficialEnables access to Gravatar profiles, avatars, and inferred interests, allowing for the retrieval of comprehensive user information and images using email addresses or profile identifiers.
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., "@Gravatar MCP Servershow me the profile and interests for matt@automattic.com"
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.
MCP Server Gravatar
Gravatar's official MCP Server, enabling access to avatars, profiles, and inferred interests.
Quick Install
For quick installation in VS Code, click one of the installation buttons below:
Related MCP server: agentfolio-mcp-server
Requirements
Node.js
This MCP server requires:
Node.js: 20.0.0 or higher
npm: 10.0.0 or higher
The server is tested and supported on:
Node.js 20 (Active LTS)
Node.js 22 (Current LTS)
Node.js 24 (Current)
Installation
You can install and run this server using npx (recommended) or by building from source.
Tools
get_profile_by_idRetrieve comprehensive Gravatar profile information using a profile identifier
Required inputs:
profileIdentifier(string): A Profile Identifier (see Identifier Types section)
Returns: Profile object as JSON with comprehensive user information
get_profile_by_emailRetrieve comprehensive Gravatar profile information using an email address
Required inputs:
email(string): The email address associated with the Gravatar profile. Can be any valid email format - the system will automatically normalize and hash the email for lookup.
Returns: Profile object as JSON with comprehensive user information
get_inferred_interests_by_idFetch AI-inferred interests for a Gravatar profile using a profile identifier
Required inputs:
profileIdentifier(string): A Profile Identifier (see Identifier Types section)
Returns: List of AI-inferred interest names as JSON
get_inferred_interests_by_emailFetch AI-inferred interests for a Gravatar profile using an email address
Required inputs:
email(string): The email address associated with the Gravatar profile. Can be any valid email format - the system will automatically normalize and hash the email for lookup.
Returns: List of AI-inferred interest names as JSON
get_avatar_by_idRetrieve the avatar image for a Gravatar profile using an avatar identifier
Required inputs:
avatarIdentifier(string): An Avatar Identifier (see Identifier Types section)
Optional inputs:
size(number, default: undefined): Desired avatar size in pixels (1-2048). Images are square, so this sets both width and height. Common sizes: 80 (default web), 200 (high-res web), 512 (large displays).defaultOption(string, default: undefined): Fallback image style when no avatar exists. Options: '404' (return HTTP 404 error instead of image), 'mp' (mystery person silhouette), 'identicon' (geometric pattern), 'monsterid' (generated monster), 'wavatar' (generated face), 'retro' (8-bit style), 'robohash' (robot), 'blank' (transparent).forceDefault(boolean, default: undefined): When true, always returns the default image instead of the user's avatar. Useful for testing default options or ensuring consistent placeholder images.rating(string, default: undefined): Maximum content rating to display. 'G' (general audiences), 'PG' (parental guidance), 'R' (restricted), 'X' (explicit). If user's avatar exceeds this rating, the default image is shown instead.
Returns: Avatar image in PNG format
get_avatar_by_emailRetrieve the avatar image for a Gravatar profile using an email address
Required inputs:
email(string): The email address associated with the Gravatar profile. Can be any valid email format - the system will automatically normalize and hash the email for lookup.
Optional inputs:
size(number, default: undefined): Desired avatar size in pixels (1-2048). Images are square, so this sets both width and height. Common sizes: 80 (default web), 200 (high-res web), 512 (large displays).defaultOption(string, default: undefined): Fallback image style when no avatar exists. Options: '404' (return HTTP 404 error instead of image), 'mp' (mystery person silhouette), 'identicon' (geometric pattern), 'monsterid' (generated monster), 'wavatar' (generated face), 'retro' (8-bit style), 'robohash' (robot), 'blank' (transparent).forceDefault(boolean, default: undefined): When true, always returns the default image instead of the user's avatar. Useful for testing default options or ensuring consistent placeholder images.rating(string, default: undefined): Maximum content rating to display. 'G' (general audiences), 'PG' (parental guidance), 'R' (restricted), 'X' (explicit). If user's avatar exceeds this rating, the default image is shown instead.
Returns: Avatar image in PNG format
Default Avatar Options
404: Return an HTTP 404 error instead of an image when no avatar existsmp: (mystery-person) A simple, cartoon-style silhouetted outline of a personidenticon: A geometric pattern based on an email hashmonsterid: A generated 'monster' with different colors, faces, etcwavatar: Generated faces with differing features and backgroundsretro: Awesome generated, 8-bit arcade-style pixelated facesrobohash: A generated robot with different colors, faces, etcblank: A transparent PNG image
Rating Options
G: Suitable for display on all websites with any audience typePG: May contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violenceR: May contain harsh profanity, intense violence, nudity, or hard drug useX: May contain sexual imagery or extremely disturbing violence
Setup
Gravatar API Key
Some parts of the Gravatar API can be used without authentication. However, using an API key is recommended as it increases the rate limits for your queries. You can generate your own API key by visiting the Developer Dashboard.
Once you have your API key, you can configure it in Claude Desktop or VS Code as shown in the sections below.
Claude Desktop Configuration
Add the following to your claude_desktop_config.json:
With API Key (Recommended)
{
"mcpServers": {
"gravatar": {
"command": "npx",
"args": [
"-y",
"@automattic/mcp-server-gravatar"
],
"env": {
"GRAVATAR_API_KEY": "your-api-key-here"
}
}
}
}Without API Key
Without an API key, strict rate limits will be applied.
A future release of this server may include tools that will only be available with an API key.
{
"mcpServers": {
"gravatar": {
"command": "npx",
"args": [
"-y",
"@automattic/mcp-server-gravatar"
]
}
}
}VS Code Configuration
For manual installation, add one of the following JSON blocks to your User Settings (JSON) file in VS Code. You can do this by pressing Cmd + Shift + P (or Ctrl + Shift + P on Windows/Linux) and typing Preferences: Open Settings (JSON).
With API Key Input (Recommended)
This configuration prompts for an API key and stores it securely:
{
"mcp": {
"inputs": [
{
"type": "promptString",
"id": "gravatar_api_key",
"description": "Gravatar API Key (optional)",
"password": true
}
],
"servers": {
"gravatar": {
"command": "npx",
"args": ["-y", "@automattic/mcp-server-gravatar"],
"env": {
"GRAVATAR_API_KEY": "${input:gravatar_api_key}"
}
}
}
}
}Without API Key
Without an API key, strict rate limits will be applied.
A future release of this server may include tools that will only be available with an API key.
{
"mcp": {
"servers": {
"gravatar": {
"command": "npx",
"args": ["-y", "@automattic/mcp-server-gravatar"]
}
}
}
}Optionally, you can add either configuration to a file called .vscode/mcp.json in your workspace. This will allow you to share the configuration with others.
Note that the
mcpkey is not needed in the.vscode/mcp.jsonfile.
Building from Local Source Files
If you want to build and run the MCP server from local source files:
# Clone the repository
git clone https://github.com/Automattic/mcp-server-gravatar.git
cd mcp-server-gravatar
# Install dependencies
npm installThe update your MCP Client configuration:
{
"mcpServers": {
"gravatar": {
"command": "npx",
"args": [
"/path/to/mcp-server-gravatar"
],
"env": {
"GRAVATAR_API_KEY": "your-api-key-here"
}
}
}
}Or witout an API Key:
{
"mcpServers": {
"gravatar": {
"command": "npx",
"args": [
"/path/to/mcp-server-gravatar"
]
}
}
}Identifier Types
The Gravatar MCP server uses different types of identifiers to access profile and avatar data:
Profile Identifiers
A Profile Identifier can be one of the following:
SHA256 Hash (preferred): An email address that has been normalized (lower-cased and trimmed) and then hashed with SHA256
MD5 Hash (deprecated): An email address that has been normalized (lower-cased and trimmed) and then hashed with MD5
URL Slug: The username portion from a Gravatar profile URL (e.g., 'username' from gravatar.com/username)
Avatar Identifiers
An Avatar Identifier is an email address that has been normalized (lower-cased and trimmed) and then hashed with either:
SHA256 (preferred)
MD5 (deprecated)
Important: Unlike Profile Identifiers, Avatar Identifiers cannot use URL slugs - only email hashes are supported.
Email Addresses
When using email-based tools, you can provide any valid email format. The system will automatically:
Normalize the email (convert to lowercase and trim whitespace)
Generate the appropriate hash for API requests
Process the email securely without storing it
Development
Using the Inspector
The MCP Inspector is a tool that helps validate your MCP server implementation. To run the inspector:
make inspectorThis will build the project and then run the MCP Inspector against your server, validating the tools and their schemas.
Development Workflow
Start the TypeScript compiler in watch mode:
make devThis will watch for changes to your TypeScript files and automatically recompile them.
To run the server after compilation:
npm startTesting
Run the test suite:
npm testRun tests with coverage:
npm run test:coverageRun tests in watch mode:
npm run test:watchMulti-Node Testing
This project is tested against multiple Node.js versions to ensure compatibility. The CI pipeline automatically tests on:
Node.js 20 (Active LTS)
Node.js 22 (Current LTS)
Node.js 24 (Current)
To test locally with different Node versions using nvm:
# Test with Node 20
nvm use 20
npm ci
npm run type-check
npm test
# Test with Node 22
nvm use 22
npm ci
npm run type-check
npm test
# Test with Node 24
nvm use 24
npm ci
npm run type-check
npm testGeneration System
This project uses a Make-driven architecture for all code generation with proper file-based dependencies:
# Generate everything (API client + MCP schemas)
make generate-all
# OR
npm run generate-all
# Generate just the OpenAPI client
make generate-client
# OR
npm run generate-client
# Generate just the MCP schemas (requires client)
make generate-schemas
# OR
npm run generate-schemasThe schema generation is configured via scripts/schemas.config.json and supports:
Configurable schema extraction from OpenAPI models
Array wrapping for responses that need structured containers
Clean output schemas that match MCP specification exactly
Automatic dependency tracking via Make
Other Useful Commands
The project includes a Makefile with several useful commands:
make download-spec: Download the Gravatar OpenAPI specmake generate-client: Generate Gravatar API client from OpenAPI specmake generate-schemas: Generate MCP output schemas from API clientmake generate-all: Generate API client and MCP schemasmake build: Build the TypeScript projectmake lint: Run lintingmake lint-fix: Run linting with auto-fixmake format: Format code with Prettiermake format-check: Check code formattingmake quality-check: Run linting and format checkingmake clean: Clean build artifacts and dependencies
Run make help to see all available commands.
Environment Variables
GRAVATAR_API_KEY: Optional API key for Gravatar API. If provided, it will be used for API requests, which increases rate limits and provides access to additional features.GRAVATAR_API_KEY_ENV_VAR: Optional name of the environment variable that contains the API key. Default isGRAVATAR_API_KEY. This is useful if you need to use a different environment variable name in your deployment environment.
When running the server locally, you can set these environment variables in your shell before starting the server:
# Set API key (recommended)
export GRAVATAR_API_KEY=your_api_key_here
# Start the server
npm startOr you can provide them inline when starting the server:
GRAVATAR_API_KEY=your_api_key_here npm startWhen configuring the server in Claude Desktop or VS Code, you can set these environment variables in the configuration as shown in the Setup section above.
License
This MCP server is licensed under the Mozilla Public License Version 2.0 (MPL-2.0). This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MPL-2.0. For more details, please see the LICENSE file in the project repository.
Available Tools
6 toolsget_avatar_by_emailGet Avatar Image by EmailARead-onlyIdempotent
Retrieve the avatar image for a Gravatar profile using an email address. The email is automatically normalized and hashed before querying the Gravatar API. 'Get the avatar image for user@example.com' or 'Show me a 200px avatar for john.doe@company.com.'
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Desired avatar size in pixels (1-2048). Images are square, so this sets both width and height. Common sizes: 80 (default web), 200 (high-res web), 512 (large displays). Gravatar will scale the image appropriately. | |
| Yes | The email address associated with the Gravatar profile. Can be any valid email format - the system will automatically normalize and hash the email for lookup. The email is processed securely and not stored. | ||
| rating | No | Maximum content rating to display. 'G' (general audiences), 'PG' (parental guidance), 'R' (restricted), 'X' (explicit). If user's avatar exceeds this rating, the default image is shown instead. | |
| forceDefault | No | When true, always returns the default image instead of the user's avatar. Useful for testing default options or ensuring consistent placeholder images. | |
| defaultOption | No | Fallback image style when no avatar exists. Options: '404' (return HTTP 404 error instead of image), 'mp' (mystery person silhouette), 'identicon' (geometric pattern), 'monsterid' (generated monster), 'wavatar' (generated face), 'retro' (8-bit style), 'robohash' (robot), 'blank' (transparent). If not specified, Gravatar's default image is returned when no avatar exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the important preprocessing behavior of automatic email normalization and hashing before the Gravatar API call, which is not captured by the annotations. The readOnlyHint, openWorldHint, and idempotentHint already cover safety, so the extra detail about hashing is meaningful rather than redundant. It doesn't discuss return format or fallback behavior, but those are partly covered by the schema.
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 substantive sentences plus a compact examples block; the main action and the critical hashing behavior are front-loaded. No filler or repetition of schema details, so every sentence 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?
The schema and annotations cover parameter details, safe read-only behavior, and idempotency, while the description supplies the purpose, lookup method, and normalization behavior. With no output schema, a brief mention of the return format (e.g., image bytes vs. URL) would improve completeness, but this is a minor gap because the tool name and examples make the image result clear. Overall it is sufficiently complete for an agent to invoke 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?
With 100% schema description coverage, the schema already documents all five parameters, including enums and size bounds, so the description doesn't need to repeat them. The only added parameter-related value is the note that email is normalized and hashed, which supplements the email parameter's schema text. This matches the baseline of 3 for a fully covered 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 description uses a specific verb ('Retrieve'), a precise resource ('avatar image for a Gravatar profile'), and the key lookup method ('using an email address'), which distinguishes it from sibling tools like get_avatar_by_id and get_profile_by_email. This gives an agent a clear basis for selecting the correct tool.
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 an email address is available and an avatar image is wanted, and the examples reinforce natural-language triggers. However, it never explicitly states when not to use it or points to alternatives such as get_avatar_by_id when an ID is available, so usage guidance remains mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_avatar_by_idGet Avatar Image by IDARead-onlyIdempotent
Retrieve the avatar image for a Gravatar profile using an avatar identifier. More efficient when you already have the hashed identifier. 'Get the avatar image for this Gravatar ID' or 'Show me a 150px avatar for user ID abc123...'
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Desired avatar size in pixels (1-2048). Images are square, so this sets both width and height. Common sizes: 80 (default web), 200 (high-res web), 512 (large displays). Gravatar will scale the image appropriately. | |
| rating | No | Maximum content rating to display. 'G' (general audiences), 'PG' (parental guidance), 'R' (restricted), 'X' (explicit). If user's avatar exceeds this rating, the default image is shown instead. | |
| forceDefault | No | When true, always returns the default image instead of the user's avatar. Useful for testing default options or ensuring consistent placeholder images. | |
| defaultOption | No | Fallback image style when no avatar exists. Options: '404' (return HTTP 404 error instead of image), 'mp' (mystery person silhouette), 'identicon' (geometric pattern), 'monsterid' (generated monster), 'wavatar' (generated face), 'retro' (8-bit style), 'robohash' (robot), 'blank' (transparent). If not specified, Gravatar's default image is returned when no avatar exists. | |
| avatarIdentifier | Yes | Avatar identifier for the Gravatar profile. An Avatar Identifier is an email address that has been normalized (e.g. lower-cased and trimmed) and then hashed with either SHA256 (preferred) or MD5 (deprecated). Note: Unlike profile identifiers, avatar identifiers cannot use URL slugs - only email hashes are supported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is handled by structured data. The description adds only an efficiency trait and confirms image retrieval; it does not disclose error behavior (e.g., 404 responses) or response format, which are minor gaps given the annotation coverage.
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 core purpose and efficiency guidance are front-loaded in two succinct sentences before the examples block. The examples are slightly redundant ('Get the avatar image for this Gravatar ID' restates sentence one) but they serve natural-language intent matching, so the structure remains efficient.
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 5-parameter tool with full schema coverage and three strong annotations, the description covers the essentials: what it does, the key input, and a usage hint. It could be improved by explicitly routing to get_avatar_by_email when only the email address is known, but nothing required for a correct call 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 all five parameters are already documented in the schema. The description adds marginal value by linking 'hashed identifier' to avatarIdentifier and hinting at size usage via the '150px' example, but these largely echo existing schema text.
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 action ('Retrieve the avatar image') and resource ('Gravatar profile using an avatar identifier'), which is clear. It differentiates from get_avatar_by_email through the efficiency note and the identifier-based retrieval key, but it never names the sibling explicitly, so the differentiation is implicit rather than stated.
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?
'More efficient when you already have the hashed identifier' provides a concrete when-to-use signal and implies the alternative lookup path (by email) when the hash is not on hand. However, it stops short of explicitly naming get_avatar_by_email or stating a formal when-not-to-use exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inferred_interests_by_emailGet Inferred Interests by EmailARead-only
Retrieve AI-inferred interests for a Gravatar profile using an email address. Returns experimental machine learning-generated interest data based on public profile information. When searching for interests, prefer to look up the interests in the Gravatar profile over the inferred interests, since they are specified explicitly by the owner of the Gravatar profile. 'Get the inferred interests for user@example.com' or 'Show me inferred interests for john.doe@company.com.'
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address for the Gravatar profile. The email will be normalized (lowercased and trimmed) and hashed before querying the Gravatar API. |
Output Schema
| Name | Required | Description |
|---|---|---|
| inferredInterests | Yes | A list of AI-inferred interests |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds valuable context: the data is 'experimental machine learning-generated' and 'based on public profile information.' This discloses the non-deterministic/experimental nature of results and their source, going beyond what annotations offer. There is no contradiction with 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 main purpose is front-loaded in the first sentence. The hint and examples are purposeful additions that aid tool selection and usage, though the hint could be seen as slightly tangential. Overall it remains compact and substantive without 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?
With a single parameter, full schema coverage, an output schema present, and annotations indicating a read-only operation, the description is complete enough. It explains what the tool returns and adds the experimental caveat and a usage preference. Nothing critical for correct invocation 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?
The input schema covers 100% of the parameter description, including the normalization and hashing behavior. The description's examples ('user@example.com') add illustration but no new semantic meaning beyond the schema. The baseline of 3 applies because the schema already 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 states a clear action ('Retrieve AI-inferred interests') with a specific resource and access method ('for a Gravatar profile using an email address'). It distinguishes itself from siblings like get_inferred_interests_by_id (by ID vs email) and get_profile_by_email (profile vs interests) without requiring schema inspection.
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 hint explicitly says to prefer explicit profile interests over inferred ones, giving a clear condition for when NOT to use this tool and effectively routing to the profile tool as the alternative. It does not explicitly mention the by-ID sibling, but the email-vs-ID distinction is embedded in the tool name and examples provide concrete invocation patterns. This is clear context with one notable exclusion, but it lacks a full when-to-use-this-tool statement versus the ID variant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inferred_interests_by_idGet Inferred Interests by IDARead-only
Retrieve AI-inferred interests for a Gravatar profile using a profile identifier. Returns experimental machine learning-generated interest data based on public profile information. When searching for interests, prefer to look up the interests in the Gravatar profile over the inferred interests, since they are specified explicitly by the owner of the Gravatar profile. 'Get the inferred interests for user ID abc123...' or 'Show me inferred interests for username johndoe.'
| Name | Required | Description | Default |
|---|---|---|---|
| profileIdentifier | Yes | Profile identifier for the Gravatar profile. A Profile Identifier is either an email address that has been normalized (e.g. lower-cased and trimmed) and then hashed with either SHA256 (preferred) or MD5 (deprecated), or Gravatar profile URL slug (e.g., 'username' from gravatar.com/username). |
Output Schema
| Name | Required | Description |
|---|---|---|
| inferredInterests | Yes | A list of AI-inferred interests |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world, and the description adds context by calling the data 'experimental machine learning-generated' and based on 'public profile information.' This aligns with the annotations and gives the agent useful expectations about data provenance and variability without contradicting any hint.
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 well-structured: a clear purpose sentence, a behavior sentence, a usage hint, and examples. It is front-loaded and easy to scan. There is minor redundancy between 'AI-inferred' and 'machine learning-generated interest data,' but it does not hurt comprehension.
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 single-parameter read-only lookup with a detailed input schema and an output schema, the description covers the essential behavior, data source, experimental nature, and example invocations. It is complete enough for an agent to invoke correctly, though it could strengthen tool selection by mentioning the by_email sibling.
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 covers the profileIdentifier parameter thoroughly, including normalization and hashing details, so the description does not need to repeat it. The examples add minor value by showing realistic invocation phrasings, but they go beyond the schema only slightly.
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 and resource: 'Retrieve AI-inferred interests for a Gravatar profile using a profile identifier.' It clearly identifies what the tool returns and the input basis. However, it does not explicitly differentiate itself from the sibling get_inferred_interests_by_email; differentiation relies mostly on the tool name and examples.
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?
There is no explicit guidance on when to use this tool versus get_inferred_interests_by_email or the profile lookup tools. The hint about preferring explicit Gravatar profile interests over inferred interests is useful, but it does not address endpoint selection. The examples illustrate phrasings rather than provide decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profile_by_emailGet Gravatar Profile by EmailARead-onlyIdempotent
Retrieve comprehensive Gravatar profile information using an email address. Returns detailed profile data including personal information, social accounts, and avatar details. 'Show me the Gravatar profile for john.doe@example.com' or 'Get profile info for user@company.com.'
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address associated with the Gravatar profile. Can be any valid email format - the system will automatically normalize and hash the email for lookup. The email is processed securely and not stored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | Yes | The SHA256 hash of the user's primary email address. |
| links | No | A list of links the user has added to their profile. This is only provided in authenticated API requests. |
| company | Yes | The user's current company's name. |
| gallery | No | Additional images a user has uploaded. This is only provided in authenticated API requests. |
| location | Yes | The user's location. |
| payments | No | The user's public payment information. This is only provided in authenticated API requests. |
| pronouns | Yes | The pronouns the user uses. |
| timezone | No | The timezone the user has. This is only provided in authenticated API requests. |
| interests | No | A list of interests the user has added to their profile. This is only provided in authenticated API requests. |
| job_title | Yes | The user's job title. |
| languages | No | The languages the user knows. This is only provided in authenticated API requests. |
| last_name | No | User's last name. This is only provided in authenticated API requests. |
| avatar_url | Yes | The URL for the user's avatar image if it has been set. |
| first_name | No | User's first name. This is only provided in authenticated API requests. |
| description | Yes | The about section on a user's profile. |
| profile_url | Yes | The full URL for the user's profile. |
| contact_info | No | The user's contact information. This is only available if the user has chosen to make it public. This is only provided in authenticated API requests. |
| display_name | Yes | The user's display name. This is the name that is displayed on their profile. |
| header_image | No | The header image used in the main profile card. |
| pronunciation | Yes | The phonetic pronunciation of the user's name. |
| avatar_alt_text | Yes | The alt text for the user's avatar image if it has been set. |
| is_organization | No | Whether user is an organization. This is only provided in authenticated API requests. |
| background_color | No | The profile background color. |
| last_profile_edit | No | The date and time (UTC) the user last edited their profile. This is only provided in authenticated API requests. |
| registration_date | No | The date the user registered their account. This is only provided in authenticated API requests. |
| verified_accounts | Yes | A list of verified accounts the user has added to their profile. This is limited to a max of 4 in unauthenticated requests. |
| number_verified_accounts | No | The number of verified accounts the user has added to their profile. This count includes verified accounts the user is hiding from their profile. This is only provided in authenticated API requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, and open-world aspects. The description adds value by specifying the response contents: personal information, social accounts, and avatar details. This gives the agent a clearer picture of what to expect beyond the schema. It does not mention any additional constraints, but given the annotations, this is sufficient.
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 a clear, front-loaded action statement and an illustrative example block. Every sentence earns its place; the examples are concrete and helpful without being verbose. There is 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 the simplicity of the tool (one parameter, no nested objects) and the presence of an output schema, the description covers the essential context: what the tool does, what it returns, and typical usage examples. Nothing critical is missing for an agent to 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?
The schema already provides a detailed description of the 'email' parameter, including normalization, hashing, and security processing. The description does not add new information about parameters beyond what the schema states. With 100% schema coverage, the baseline score of 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 a specific action ('Retrieve comprehensive Gravatar profile information') and the resource ('using an email address'). It distinguishes from sibling tools by emphasizing email-based lookup, and the examples reinforce the intended use. This is as clear as it gets for a lookup tool.
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 this tool is for email-based profile retrieval, but it does not explicitly state when to use it over alternatives like get_profile_by_id or get_avatar_by_email. The examples show usage but no exclusions or conditions. A short mention of 'use this when you have an email, otherwise use the ID-based variant' would have strengthened it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profile_by_idGet Gravatar Profile by IDARead-onlyIdempotent
Retrieve comprehensive Gravatar profile information using a profile identifier. Returns detailed profile data including personal information, social accounts, and avatar details. 'Get the profile for Gravatar user with ID abc123...' or 'Show me the profile for username johndoe.'
| Name | Required | Description | Default |
|---|---|---|---|
| profileIdentifier | Yes | Profile identifier for the Gravatar profile. A Profile Identifier is either an email address that has been normalized (e.g. lower-cased and trimmed) and then hashed with either SHA256 (preferred) or MD5 (deprecated), or Gravatar profile URL slug (e.g., 'username' from gravatar.com/username). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | Yes | The SHA256 hash of the user's primary email address. |
| links | No | A list of links the user has added to their profile. This is only provided in authenticated API requests. |
| company | Yes | The user's current company's name. |
| gallery | No | Additional images a user has uploaded. This is only provided in authenticated API requests. |
| location | Yes | The user's location. |
| payments | No | The user's public payment information. This is only provided in authenticated API requests. |
| pronouns | Yes | The pronouns the user uses. |
| timezone | No | The timezone the user has. This is only provided in authenticated API requests. |
| interests | No | A list of interests the user has added to their profile. This is only provided in authenticated API requests. |
| job_title | Yes | The user's job title. |
| languages | No | The languages the user knows. This is only provided in authenticated API requests. |
| last_name | No | User's last name. This is only provided in authenticated API requests. |
| avatar_url | Yes | The URL for the user's avatar image if it has been set. |
| first_name | No | User's first name. This is only provided in authenticated API requests. |
| description | Yes | The about section on a user's profile. |
| profile_url | Yes | The full URL for the user's profile. |
| contact_info | No | The user's contact information. This is only available if the user has chosen to make it public. This is only provided in authenticated API requests. |
| display_name | Yes | The user's display name. This is the name that is displayed on their profile. |
| header_image | No | The header image used in the main profile card. |
| pronunciation | Yes | The phonetic pronunciation of the user's name. |
| avatar_alt_text | Yes | The alt text for the user's avatar image if it has been set. |
| is_organization | No | Whether user is an organization. This is only provided in authenticated API requests. |
| background_color | No | The profile background color. |
| last_profile_edit | No | The date and time (UTC) the user last edited their profile. This is only provided in authenticated API requests. |
| registration_date | No | The date the user registered their account. This is only provided in authenticated API requests. |
| verified_accounts | Yes | A list of verified accounts the user has added to their profile. This is limited to a max of 4 in unauthenticated requests. |
| number_verified_accounts | No | The number of verified accounts the user has added to their profile. This count includes verified accounts the user is hiding from their profile. This is only provided in authenticated API requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the description does not need to repeat those. It adds value by disclosing the nature of the returned data (personal information, social accounts, avatar details), which goes beyond the bare fact that it retrieves a profile. No contradictions exist between the description and 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 a single, well-structured sentence that front-loads the main action and resource, followed by an examples block that clarifies intended usage. It contains no redundancy or filler; every sentence contributes directly to the agent's understanding.
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 a simple read operation with one well-documented parameter, and an output schema is present, so return value details are not required in the description. The description covers the type of data returned and the accepted input forms. It lacks explicit handling of not-found cases or error behavior, but those are not essential for a straightforward retrieval tool given the annotations and 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?
The input schema already provides a thorough description of the profileIdentifier parameter, covering both email hashes (SHA256/MD5) and URL slugs. With 100% schema coverage, the description adds no additional meaning about the parameter itself; it merely reiterates the concept. The baseline of 3 applies because the schema carries the full semantic 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 verb (retrieve) and resource (comprehensive Gravatar profile) and explains the input (profile identifier). It includes illustrative examples that ground the usage. However, it does not explicitly distinguish this tool from the sibling get_profile_by_email, which is a similar operation keyed on a different input; the differentiation is only implied by the parameter description and title.
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 no explicit guidance on when to choose this tool over its siblings. While the examples imply it is for identifiers (hash or slug), there is no statement such as 'use get_profile_by_email when you have an email address' or any exclusions. The context of sibling tools is present, but the description does not reference them, leaving the selection decision partially to inference.
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.
6 tool updates
v0.1.0-beta.4- First observed
get_avatar_by_email - First observed
get_avatar_by_id - First observed
get_inferred_interests_by_email - First observed
get_inferred_interests_by_id - First observed
get_profile_by_email - First observed
get_profile_by_id
TDQS
Scored across 6 tools
The tools are clearly grouped by resource (profile, interests, avatar) and identifier type (ID vs email), making their purposes distinct. However, the pairs for each resource overlap in outcome—only the lookup method differs—which could cause minor confusion about which to use. The descriptions clearly state the input difference, so ambiguity is limited.
All six tools follow a consistent verb_noun_by_identifier pattern: get_profile_by_id, get_profile_by_email, get_inferred_interests_by_id, etc. This uniformity makes the toolset highly predictable and easy to navigate.
Six tools is a reasonable size for a focused Gravatar read-only server. Each resource (profile, interests, avatar) has two lookup variants, covering the main read operations without bloat. The count is neither too thin nor excessive for the API's scope.
The server covers the primary read operations for Gravatar profiles: retrieving profile details, inferred interests, and avatars, each via both ID and email. Minor gaps exist, such as no explicit search or listing endpoints, but for a typical read-only Gravatar integration, the surface is sufficient.
Maintenance
Related MCP Connectors
Identity resolution MCP server for phone/email lookups across 31+ services. Global + India coverage.
Official IPinfo MCP Server - IP intelligence tools for AI assistants
Agent-native MCP server over 49M+ US public and government records, privacy-first, always current.
Read public AT Protocol profiles, records, threads, backlinks and lexicons. No API key required.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceIdentity resolution MCP server for phone/email lookups across 31+ services. Provide detailed Identity info, Breach Info, Global + India coverage.1MIT
- AlicenseAqualityCmaintenanceMCP server for AgentFolio — the identity and reputation layer for AI agents. Query agent profiles, trust scores, verification status, and marketplace listings through 8 MCP tools.953 npm1MIT
- AlicenseNot gradedqualityDmaintenanceThis MCP server enables AI-assisted professional profile generation by connecting to verified employee work data (skills, career history, certifications, projects) from employer HCM systems.MIT
- AlicenseAqualityDmaintenanceMCP server providing image analysis tools for AI agents, including metadata extraction, favicon discovery, and placeholder generation.531 npmMIT