Skip to main content
Glama
piersonr

little-green-light-mcp

by piersonr

little-green-light-mcp

A read-only MCP server for the Little Green Light donor CRM. Any stdio MCP client can use it to look up constituents, list gifts in a date range, or fetch one person's giving history.

The server name is lgl-mcp. How you register it depends on the host — see Setup.

Read-only by construction

This server has no create, update, or delete tools — not disabled, absent. lgl.js exposes only a GET request function; there is no code path anywhere in this project that can mutate a donor record. Run npm run audit:readonly after any change to confirm mechanically.

Any future write path (e.g. syncing donations) belongs in LGL's own reviewed Integration Queue, not here.

Related MCP server: SQL Server MCP

Setup

  1. Get an API key from LGL: Settings → Integration Settings → LGL API.

  2. Put it in ~/.config/lgl-mcp/env (already created, chmod 600):

    LGL_API_KEY=your-key-here

    Alternatively, add a macOS Keychain item named lgl-api-key, or set the LGL_API_KEY environment variable for a one-off run. The key is never logged, committed, or echoed in error messages.

  3. Install dependencies (already done on first checkout):

    npm install
  4. Point a stdio MCP host at this server. The command is node; the argument is the absolute path to index.js:

    {
      "command": "node",
      "args": ["/absolute/path/to/little-green-light-mcp/index.js"]
    }

    Wrap that in whatever config shape your host uses (mcpServers, a top-level server map, and so on). No extra env vars are required if the key is in ~/.config/lgl-mcp/env or Keychain. Set LGL_API_KEY in the host's env block only for a one-off override.

Tools

Tool

What it does

search_constituents

Search by name or exact email address. Compact rows are identity only — no giving totals.

get_constituent

Full profile for one constituent by id, including giving totals computed from the full gift history (0 if none).

get_constituent_gifts

Giving history for one constituent.

search_gifts

Search gifts by date range, across all constituents.

list_funds

All configured funds (cached).

list_appeals

All configured appeals (cached).

list_gift_categories

All configured gift categories (cached).

list_gift_types

All configured gift types (cached).

Every tool accepts verbose: true to get the full LGL object instead of the trimmed summary. Compact constituents include name, email, phone, and city/state. Giving dates and lifetime total are only on get_constituent. Compact gifts include date, amount, fund_id, note, and donor name (when expanded). List responses that are capped include a note field saying how many results were omitted — nothing is silently truncated.

Confirmed query syntax

LGL's /constituents/search and /gifts/search take q[]=field=value pairs, not free text — this was undocumented for several fields and confirmed by probing a live account:

  • Constituents: name=<text> (LGL's own documented example) or eaddr=<email> for an exact email match (undocumented; guesses like email=/email_address= were rejected).

  • Gifts: date_from=YYYY-MM-DD / date_to=YYYY-MM-DD (confirmed real filters — an out-of-range date zeroes total_items). Multiple q[] entries AND together.

  • Gifts have no fund or amount filter on this endpoint — fund_id, fund, fund_ids, campaign_id, amount_from, amount_to were all tried and rejected as unknown parameters. search_gifts doesn't expose these; filter results client-side on fund_id / note if needed.

  • A gift's donor name only appears when the request includes expand=first_name,last_name,org_name — LGL doesn't nest a constituent object in the gift response otherwise.

  • get_constituent's giving totals (first/last gift date, lifetime amount) aren't returned by LGL on the constituent object at all — they're computed here from that constituent's own gift history, paged to completion. A constituent with no gifts returns lifetime_amount: 0. A safety cap still applies (10,000 gifts); the response says so if it is hit.

Development

npm run inspect          # MCP Inspector — exercise tools interactively
npm run audit:readonly   # mechanical check: no POST/PATCH/PUT/DELETE anywhere

Rate limits

LGL allows 300 API calls per 5-minute window. lgl.js throttles internally (sliding window) and retries with backoff on 429/5xx, so a broad question that fans out into many calls degrades gracefully instead of erroring.

Available Tools

8 tools
get_constituentget_constituentA

Fetch one constituent's profile by LGL id, including giving totals computed from the full gift history.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesLGL constituent id.
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains the key behavioral trait: 'giving totals computed from the full gift history' – an important detail not obvious from the name. With no annotations provided, the description carries full burden for behavioral disclosure. It doesn't clarify idempotency, performance implications (computation might be slow), or whether verbose=true also includes these totals. This is adequate but not comprehensive for an un-annotated tool.

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, front-loaded sentence that clearly states the action, the input, and the unique output. Every word adds value with no redundancy or filler.

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?

Given the tool's moderate complexity (2 params, no output schema, no nested objects), the description adequately covers fetching by ID and the computed totals. It could improve by noting whether giving totals appear only in the compact summary or also in verbose mode, and whether the tool requires specific permissions. But overall it is sufficient for an agent to use 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?

Schema description coverage is 100%, so both parameters are documented in the schema. The description adds no additional parameter-level detail beyond what the schema already provides (the id field description is simply 'LGL constituent id.' and verbose says 'Return the full, untrimmed LGL object instead of the compact summary.'). 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 uses a specific verb ('Fetch') and clearly identifies the resource ('one constituent's profile') and the identifier ('LGL id'). It also distinguishes itself from sibling tools like search_constituents (search vs. fetch by ID) and get_constituent_gifts (profile vs. gifts list). Including 'giving totals computed from the full gift history' adds distinct value.

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 description implies usage when you have a specific LGL id and need a full profile with computed giving totals, which differentiates from search_constituents (when you don't have an ID) and get_constituent_gifts (when you need gift details, not totals). However, it lacks explicit when-not-to-use or alternative guidance for borderline cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_constituent_giftsget_constituent_giftsA

List the giving history for one constituent, most recent first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesLGL constituent id.
limitNoMax results (default 25, max 100).
offsetNoNumber of results to skip, for paging.
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool lists data (implying read-only) and orders results by recency, but omits details like pagination default behavior (limit/offset only via params), whether deleted gifts are included, or rate limits. The description adds some value beyond the schema but leaves gaps.

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, concise sentence that immediately conveys the tool's purpose, with no filler or redundancy. It earns its place completely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters with full schema coverage, no output schema, and no annotations, the description explains the core action but doesn't cover usage context like prerequisite (valid constituent ID) or edge cases (empty history). It's minimally complete for a list tool but could be more helpful.

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 the baseline is 3. The description does not add any parameter-specific context beyond what the schema already provides via descriptions for 'id', 'limit', 'offset', and 'verbose'. This is adequate but not enhancing.

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 ('List'), a clear resource ('giving history'), and a specific scope ('one constituent'). It also states the ordering ('most recent first'), which distinguishes it from sibling tools like 'search_gifts' or 'search_constituents'.

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?

The description does not provide any guidance on when to use this tool versus alternatives (e.g., 'search_gifts' for multi-constituent queries). It also fails to mention that it requires a constituent ID, which is implied from context but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_appealslist_appealsA

List all appeals configured in LGL. Small, rarely-changing reference data — cached for this session after the first call.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of disclosure. It openly states the tool is read-only ('List'), the data is 'small, rarely-changing,' and that results are 'cached for this session after the first call.' This is valuable behavioral context beyond just the schema. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero wasted words. The first sentence states purpose, the second provides behavioral context (caching, data nature). Information is front-loaded and 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?

Given the tool is a simple list with one optional parameter and no output schema, the description is sufficiently complete. It covers purpose, data characteristics, and caching behavior. The only minor gap is not describing the default output format (compact summary), but this is implied by the verbose parameter description.

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 the single parameter 'verbose' is fully documented in the schema. The description adds no additional meaning or usage guidance beyond what the schema provides. Baseline 3 is appropriate; the description doesn't enhance parameter semantics but also doesn't need to.

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 explicitly states 'List all appeals configured in LGL,' using a specific verb ('List') and resource ('appeals'). It clearly distinguishes from siblings like search_constituents or list_funds by focusing on the appeals entity. The caching hint adds further precision about scope and refresh behavior.

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 description implies use via the verb 'List' and notes it's 'small, rarely-changing reference data' and 'cached for this session after the first call.' This suggests efficiency but doesn't explicitly state when not to use it or mention alternatives like search_gifts for other lookups. Still, the context is clear enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_fundslist_fundsA

List all funds configured in LGL. Small, rarely-changing reference data — cached for this session after the first call.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully shoulders the burden of disclosing behavior. It reveals that the tool returns all funds (no filtering), data is small and rarely-changing, and results are cached per session. This explains idempotency and performance traits, though it omits specifics like return format or authentication needs.

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 only two sentences, each earning its place: the first states purpose, the second adds behavioral context (caching, data size). It is front-loaded and contains no redundancy or filler words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is simple (one optional param, no output schema), the description covers purpose and caching but does not specify the return structure or indicate whether it returns a list of fund objects. Without an output schema, the agent might need more details about the response format to use the tool confidently.

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 single parameter 'verbose' is fully described in the input schema with clear explanation ('Return the full, untrimmed LGL object instead of the compact summary'). The tool description adds no additional meaning beyond the schema, so it meets the baseline for high schema coverage without adding extra value.

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 'List all funds configured in LGL' with a specific verb and resource. It also adds useful context about the data being small and rarely-changing, distinguishing it from other list tools for different entities (e.g., list_appeals, list_gift_categories).

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 description implicitly guides usage by noting the data is cached for the session after the first call, suggesting efficiency and infrequent need to re-call. It does not explicitly compare to siblings or state when not to use, but the context is clear enough for a simple reference data list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_gift_categorieslist_gift_categoriesA

List all gift categories configured in LGL. Small, rarely-changing reference data — cached for this session after the first call.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses caching behavior and data nature, which is useful. However, it does not explicitly state read-only safety, potential errors, or behavior when no categories exist. 'List' implies read-only but not explicit.

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?

Two concise sentences, front-loaded with the primary action, then a sentence adding behavioral context. No wasted words.

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 simple list tool with one optional parameter and no output schema, the description provides purpose, data scope, and caching behavior. It doesn't describe return format explicitly, but 'List' implies returning categories. Moderate completeness.

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 already fully describes the only parameter 'verbose' with its own description, so coverage is 100%. The tool description adds no additional parameter context, matching the baseline of 3.

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?

Description uses specific verb 'List' and resource 'gift categories configured in LGL', clearly stating what it does. However, it does not explicitly differentiate from sibling list tools like list_funds or list_gift_types, though the resource name is distinct.

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?

Provides clear context: 'Small, rarely-changing reference data — cached for this session after the first call' explains when this tool is appropriate and suggests efficient repeated use. Does not name alternatives or exclusions, but context is sufficient for a simple list tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_gift_typeslist_gift_typesA

List all gift types configured in LGL. Small, rarely-changing reference data — cached for this session after the first call.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It goes beyond a basic purpose statement by revealing that the data is cached for the session after the first call and noting it is small and rarely-changing. This adds meaningful context about performance and staleness expectations. It does not cover authentication or detailed output but these are minor omissions for a simple list tool.

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 zero waste. It is front-loaded with the primary purpose and adds a second sentence for extra behavioral context. Every word 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?

Given the tool's simplicity (one optional parameter, no output schema, no annotations), the description covers the key aspects: what the tool does, the nature of the data, and caching behavior. It does not describe the return format explicitly, which would be helpful since there is no output schema. However, for a straightforward list tool, this is nearly complete.

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 has 100% coverage (one boolean parameter 'verbose' with description). The tool description does not add any additional meaning to the parameter beyond what the schema already provides. Baseline 3 is appropriate since the schema handles parameter semantics adequately.

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 ('List'), identifies the resource ('all gift types'), and includes the scope ('configured in LGL'). It also adds useful nuance about the data being small and rarely-changing. The name and context clearly distinguish it from sibling listing tools like list_funds or list_appeals, though no explicit differentiation is stated.

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 when to use this tool (for gift types reference data) but does not explicitly state when not to use it or provide alternatives. The mention of caching suggests it is efficient to call repeatedly, but no direct comparison to siblings is given. Usage guidance is implied but not formalized.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_constituentssearch_constituentsA

Search LGL constituents by name or email address. Returns a compact summary per match (name, email, phone, city/state). Giving totals are not included — use get_constituent for those. Pass verbose:true for the full record.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 25, max 100).
queryYesA name (e.g. 'Pierson') or an email address to match exactly.
offsetNoNumber of results to skip, for paging.
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of behavioral disclosure. It clearly states that the default return is a compact summary (listing fields), that giving totals are excluded, and that setting verbose:true returns the full record. These details are beyond what the schema provides and accurately represent the tool's behavior.

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 short sentences that front-load the purpose and then provide critical usage hints. Every sentence adds meaningful information—no filler, no repetition. It is efficient and well-structured for quick scanning by an AI agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately explains the return format (compact summary fields) and distinguishes it from get_constituent. It notes the searchable fields (name, email) and the verbose option. Some minor gaps exist: pagination behavior (offset/limit) is not elaborated, and ordering is not mentioned. However, for a search tool, these are secondary; the core information is presented sufficiently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds value by explaining the default behavior (compact summary) and that verbose:true yields the full record. This clarifies the distinction between default and verbose output, which the schema alone does not emphasize. The description does not add to limit/offset meaning, but the added context for verbose and the query parameter (name/email) justify a 4.

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 explicitly states 'Search LGL constituents by name or email address' and specifies the returned compact summary fields. It distinguishes itself from sibling tools like get_constituent (which provides giving totals) and search_gifts (different resource), so the purpose is clearly defined and not confused with others.

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 description gives direct guidance: 'Giving totals are not included — use get_constituent for those.' This tells the agent when to use this tool versus the sibling get_constituent. It also mentions passing verbose:true for the full record, advising on optional behavior. It lacks explicit 'when not to use' statements but the alternative is clear, making it a strong 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_giftssearch_giftsA

Search gifts across all constituents by date range. Useful for totals and reconciliation questions (e.g. 'gifts in 2025'). Fund/amount filtering isn't exposed by LGL's search endpoint — filter the results client-side if needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 25, max 100).
offsetNoNumber of results to skip, for paging.
to_dateNoYYYY-MM-DD, inclusive.
verboseNoReturn the full, untrimmed LGL object instead of the compact summary.
from_dateNoYYYY-MM-DD, inclusive.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses date-range support and the filtering limitation but omits behavioral details like pagination behavior, whether results are sorted, or any permissions required. Adequate but not rich.

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?

Two concise sentences. First states purpose, second provides use case and a key limitation. No filler or redundancy; excellent front-loading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a search tool with 5 parameters but no output schema. Covers primary filtering and a limitation, but does not describe the return format or what 'search' means beyond dates (e.g., does it search by gift amount, type, etc.?). Missing output details moderate completeness.

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 baseline is 3. The description adds no extra meaning beyond what the schema provides; it only reinforces 'by date range' which is already clear from from_date/to_date fields.

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?

Clearly states 'Search gifts across all constituents by date range' with a specific verb, resource, and scope. Distinguished from siblings like search_constituents and get_constituent_gifts by emphasizing broad cross-constituent search with date filtering.

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?

Explicitly mentions use case ('totals and reconciliation questions') and gives an example. Also notes a limitation (no fund/amount filtering) and a workaround. However, does not explicitly tell the agent when not to use this tool versus alternatives like get_constituent_gifts for individual lookup.

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. Dates show when Glama detected each change.

  1. 8 tool updatesv0.1.0
    • First observedget_constituent
    • First observedget_constituent_gifts
    • First observedlist_appeals
    • First observedlist_funds
    • First observedlist_gift_categories
    • First observedlist_gift_types
    • First observedsearch_constituents
    • First observedsearch_gifts

TDQS

A3.9/5.0
Disambiguation4/5

Tools are mostly distinct: list_funds, list_appeals, list_gift_categories, list_gift_types each target a different reference data type. search_constituents and get_constituent both relate to constituents but search is for lookup by name/email while get_constituent is for a specific ID with more detail. get_constituent_gifts and search_gifts are distinct (one per constituent, one across all). Only slight overlap between search_constituents and get_constituent, but descriptions clarify their purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: 'list_' for reference data, 'search_' for search operations, 'get_' for fetching a single record, and 'get_constituent_gifts' for the gift history. This is uniform and predictable.

Tool Count5/5

8 tools is well within the ideal 3-15 range. The server covers a focused set of operations for an LGL (Little Green Light) integration: listing reference data, searching constituents, fetching details, and querying gifts. Each tool has a clear purpose, and none seem redundant.

Completeness3/5

The tools cover querying and searching capabilities well, but there are no create, update, or delete operations, so it's a read-only surface. For a CRM/donation tool, one might expect capabilities like adding a gift or updating a constituent, but the server's stated purpose is not explicit about that. The lack of write operations is a notable gap for full lifecycle coverage, but it may be intentional for this MCP server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    An MCP server for Microsoft SQL Server integration that enables users to query, monitor, and analyze databases directly through Claude. It supports schema exploration, performance analysis, and optional write operations via natural language commands.
    10
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A read-only MCP server for SQL Server database introspection that enables Claude to explore and query databases via tools like listing objects and executing SELECT queries.
    20
    1
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Read-only MCP server for Meta (Facebook) Graph API, enabling access to Marketing API, Pages, Instagram, and WhatsApp Business data through Claude Code and any MCP-compatible client.
    30
    9
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/piersonr/little-green-light-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server