little-green-light-mcp
Click on "Install 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., "@little-green-light-mcpshow me our top donors this year"
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.
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
Get an API key from LGL: Settings → Integration Settings → LGL API.
Put it in
~/.config/lgl-mcp/env(already created, chmod 600):LGL_API_KEY=your-key-hereAlternatively, add a macOS Keychain item named
lgl-api-key, or set theLGL_API_KEYenvironment variable for a one-off run. The key is never logged, committed, or echoed in error messages.Install dependencies (already done on first checkout):
npm installPoint a stdio MCP host at this server. The command is
node; the argument is the absolute path toindex.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/envor Keychain. SetLGL_API_KEYin the host's env block only for a one-off override.
Tools
Tool | What it does |
| Search by name or exact email address. Compact rows are identity only — no giving totals. |
| Full profile for one constituent by id, including giving totals computed from the full gift history (0 if none). |
| Giving history for one constituent. |
| Search gifts by date range, across all constituents. |
| All configured funds (cached). |
| All configured appeals (cached). |
| All configured gift categories (cached). |
| 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) oreaddr=<email>for an exact email match (undocumented; guesses likeemail=/email_address=were rejected).Gifts:
date_from=YYYY-MM-DD/date_to=YYYY-MM-DD(confirmed real filters — an out-of-range date zeroestotal_items). Multipleq[]entries AND together.Gifts have no fund or amount filter on this endpoint —
fund_id,fund,fund_ids,campaign_id,amount_from,amount_towere all tried and rejected as unknown parameters.search_giftsdoesn't expose these; filter results client-side onfund_id/noteif 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 returnslifetime_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 anywhereRate 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 toolsget_constituentget_constituentA
Fetch one constituent's profile by LGL id, including giving totals computed from the full gift history.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | LGL constituent id. | |
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | LGL constituent id. | |
| limit | No | Max results (default 25, max 100). | |
| offset | No | Number of results to skip, for paging. | |
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25, max 100). | |
| query | Yes | A name (e.g. 'Pierson') or an email address to match exactly. | |
| offset | No | Number of results to skip, for paging. | |
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25, max 100). | |
| offset | No | Number of results to skip, for paging. | |
| to_date | No | YYYY-MM-DD, inclusive. | |
| verbose | No | Return the full, untrimmed LGL object instead of the compact summary. | |
| from_date | No | YYYY-MM-DD, inclusive. |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.1.0- First observed
get_constituent - First observed
get_constituent_gifts - First observed
list_appeals - First observed
list_funds - First observed
list_gift_categories - First observed
list_gift_types - First observed
search_constituents - First observed
search_gifts
TDQS
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.
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.
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.
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
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
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP server for nonprofit financials via ProPublica — IRS Form 990 data for 1.8M+ nonprofits.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn 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.101MIT
- AlicenseAqualityDmaintenanceA 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.201MIT
- AlicenseCqualityDmaintenanceRead-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.3091MIT
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server that connects Claude to the Northwind sample PostgreSQL database, allowing natural language queries to generate SQL and charts.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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