Skip to main content
Glama
Automattic

Gravatar MCP Server

Official
by Automattic

NPM Type Definitions Node Node-LTS

GitHub branch status Node.js CI Tested

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:

Install with NPX in VS Code Install with NPX in VS Code Insiders

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

  1. get_profile_by_id

    • Retrieve comprehensive Gravatar profile information using a profile identifier

    • Required inputs:

    • Returns: Profile object as JSON with comprehensive user information

  2. get_profile_by_email

    • Retrieve 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

  3. get_inferred_interests_by_id

    • Fetch AI-inferred interests for a Gravatar profile using a profile identifier

    • Required inputs:

    • Returns: List of AI-inferred interest names as JSON

  4. get_inferred_interests_by_email

    • Fetch 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

  5. get_avatar_by_id

    • Retrieve the avatar image for a Gravatar profile using an avatar identifier

    • Required inputs:

    • 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

  6. get_avatar_by_email

    • Retrieve 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 exists

  • mp: (mystery-person) A simple, cartoon-style silhouetted outline of a person

  • identicon: A geometric pattern based on an email hash

  • monsterid: A generated 'monster' with different colors, faces, etc

  • wavatar: Generated faces with differing features and backgrounds

  • retro: Awesome generated, 8-bit arcade-style pixelated faces

  • robohash: A generated robot with different colors, faces, etc

  • blank: A transparent PNG image

Rating Options

  • G: Suitable for display on all websites with any audience type

  • PG: May contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence

  • R: May contain harsh profanity, intense violence, nudity, or hard drug use

  • X: 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:

{
  "mcpServers": {
    "gravatar": {
      "command": "npx",
      "args": [
        "-y",
        "@automattic/mcp-server-gravatar"
      ],
      "env": {
        "GRAVATAR_API_KEY": "your-api-key-here"
      }
    }
  }
}

Without API Key

NOTE
  • 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).

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

NOTE
  • 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 mcp key is not needed in the .vscode/mcp.json file.

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 install

The 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:

  1. SHA256 Hash (preferred): An email address that has been normalized (lower-cased and trimmed) and then hashed with SHA256

  2. MD5 Hash (deprecated): An email address that has been normalized (lower-cased and trimmed) and then hashed with MD5

  3. 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:

  1. SHA256 (preferred)

  2. 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:

  1. Normalize the email (convert to lowercase and trim whitespace)

  2. Generate the appropriate hash for API requests

  3. 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 inspector

This 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 dev

This will watch for changes to your TypeScript files and automatically recompile them.

To run the server after compilation:

npm start

Testing

Run the test suite:

npm test

Run tests with coverage:

npm run test:coverage

Run tests in watch mode:

npm run test:watch

Multi-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 test

Generation 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-schemas

The 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 spec

  • make generate-client: Generate Gravatar API client from OpenAPI spec

  • make generate-schemas: Generate MCP output schemas from API client

  • make generate-all: Generate API client and MCP schemas

  • make build: Build the TypeScript project

  • make lint: Run linting

  • make lint-fix: Run linting with auto-fix

  • make format: Format code with Prettier

  • make format-check: Check code formatting

  • make quality-check: Run linting and format checking

  • make 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 is GRAVATAR_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 start

Or you can provide them inline when starting the server:

GRAVATAR_API_KEY=your_api_key_here npm start

When 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 tools
get_avatar_by_emailGet Avatar Image by EmailA
Read-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.'

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoDesired 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.
emailYesThe 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.
ratingNoMaximum 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.
forceDefaultNoWhen true, always returns the default image instead of the user's avatar. Useful for testing default options or ensuring consistent placeholder images.
defaultOptionNoFallback 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

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 IDA
Read-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...'

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoDesired 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.
ratingNoMaximum 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.
forceDefaultNoWhen true, always returns the default image instead of the user's avatar. Useful for testing default options or ensuring consistent placeholder images.
defaultOptionNoFallback 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.
avatarIdentifierYesAvatar 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

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 EmailA
Read-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.'

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesEmail address for the Gravatar profile. The email will be normalized (lowercased and trimmed) and hashed before querying the Gravatar API.

Output Schema

ParametersJSON Schema
NameRequiredDescription
inferredInterestsYesA list of AI-inferred interests

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 IDA
Read-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.'

ParametersJSON Schema
NameRequiredDescriptionDefault
profileIdentifierYesProfile 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

ParametersJSON Schema
NameRequiredDescription
inferredInterestsYesA list of AI-inferred interests

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 EmailA
Read-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.'

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe 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

ParametersJSON Schema
NameRequiredDescription
hashYesThe SHA256 hash of the user's primary email address.
linksNoA list of links the user has added to their profile. This is only provided in authenticated API requests.
companyYesThe user's current company's name.
galleryNoAdditional images a user has uploaded. This is only provided in authenticated API requests.
locationYesThe user's location.
paymentsNoThe user's public payment information. This is only provided in authenticated API requests.
pronounsYesThe pronouns the user uses.
timezoneNoThe timezone the user has. This is only provided in authenticated API requests.
interestsNoA list of interests the user has added to their profile. This is only provided in authenticated API requests.
job_titleYesThe user's job title.
languagesNoThe languages the user knows. This is only provided in authenticated API requests.
last_nameNoUser's last name. This is only provided in authenticated API requests.
avatar_urlYesThe URL for the user's avatar image if it has been set.
first_nameNoUser's first name. This is only provided in authenticated API requests.
descriptionYesThe about section on a user's profile.
profile_urlYesThe full URL for the user's profile.
contact_infoNoThe 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_nameYesThe user's display name. This is the name that is displayed on their profile.
header_imageNoThe header image used in the main profile card.
pronunciationYesThe phonetic pronunciation of the user's name.
avatar_alt_textYesThe alt text for the user's avatar image if it has been set.
is_organizationNoWhether user is an organization. This is only provided in authenticated API requests.
background_colorNoThe profile background color.
last_profile_editNoThe date and time (UTC) the user last edited their profile. This is only provided in authenticated API requests.
registration_dateNoThe date the user registered their account. This is only provided in authenticated API requests.
verified_accountsYesA list of verified accounts the user has added to their profile. This is limited to a max of 4 in unauthenticated requests.
number_verified_accountsNoThe 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

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 IDA
Read-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.'

ParametersJSON Schema
NameRequiredDescriptionDefault
profileIdentifierYesProfile 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

ParametersJSON Schema
NameRequiredDescription
hashYesThe SHA256 hash of the user's primary email address.
linksNoA list of links the user has added to their profile. This is only provided in authenticated API requests.
companyYesThe user's current company's name.
galleryNoAdditional images a user has uploaded. This is only provided in authenticated API requests.
locationYesThe user's location.
paymentsNoThe user's public payment information. This is only provided in authenticated API requests.
pronounsYesThe pronouns the user uses.
timezoneNoThe timezone the user has. This is only provided in authenticated API requests.
interestsNoA list of interests the user has added to their profile. This is only provided in authenticated API requests.
job_titleYesThe user's job title.
languagesNoThe languages the user knows. This is only provided in authenticated API requests.
last_nameNoUser's last name. This is only provided in authenticated API requests.
avatar_urlYesThe URL for the user's avatar image if it has been set.
first_nameNoUser's first name. This is only provided in authenticated API requests.
descriptionYesThe about section on a user's profile.
profile_urlYesThe full URL for the user's profile.
contact_infoNoThe 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_nameYesThe user's display name. This is the name that is displayed on their profile.
header_imageNoThe header image used in the main profile card.
pronunciationYesThe phonetic pronunciation of the user's name.
avatar_alt_textYesThe alt text for the user's avatar image if it has been set.
is_organizationNoWhether user is an organization. This is only provided in authenticated API requests.
background_colorNoThe profile background color.
last_profile_editNoThe date and time (UTC) the user last edited their profile. This is only provided in authenticated API requests.
registration_dateNoThe date the user registered their account. This is only provided in authenticated API requests.
verified_accountsYesA list of verified accounts the user has added to their profile. This is limited to a max of 4 in unauthenticated requests.
number_verified_accountsNoThe 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

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv0.1.0-beta.4
    • First observedget_avatar_by_email
    • First observedget_avatar_by_id
    • First observedget_inferred_interests_by_email
    • First observedget_inferred_interests_by_id
    • First observedget_profile_by_email
    • First observedget_profile_by_id

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers