Skip to main content
Glama
carlosahumada89

govrider-mcp-server

search_enriched

Search global government tenders, RFPs, grants, and frameworks for your technology or consulting service. Returns an AI-ranked summary of 10 best matches with title, match score, region, type, value, and deadline.

Instructions

Full AI-powered government procurement search with Claude Sonnet intelligence. Returns a compact ranked summary of 10 matches showing title, match score, region, type, value, and deadline. Costs 1 credit. Always searches globally across all sources to find the best matches. After reviewing the summary, use get_opportunity with a result number (1-10) to see the full strategic fit memo, political context memo, description, and application URL for any match - at no extra cost.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesDetailed description of the technology, product, or service (min 20 chars). Include any country, region, or sector context directly in the description. More detail = better matches.

Implementation Reference

  • The handler function for the search_enriched tool. It calls /api/v1/search/enriched, caches the results, and returns a compact ranked summary table of 10 matches with title, match score, region, type, value, deadline, and credits remaining.
      async ({ query }) => {
        const body: Record<string, unknown> = { query }
    
        const { ok, status, data } = await apiCall('/api/v1/search/enriched', body)
    
        if (!ok) {
          return { content: [{ type: 'text' as const, text: errorText(data, status) }], isError: true }
        }
    
        const matches = data.matches as Array<Record<string, unknown>>
        const totalScanned = data.total_scanned as number
        const creditsRemaining = data.credits_remaining as number | null
    
        if (!matches || matches.length === 0) {
          return {
            content: [{
              type: 'text' as const,
              text: `No opportunities found matching your query. Try broadening your search or removing filters.`,
            }],
          }
        }
    
        // Cache full results for get_opportunity
        cachedMatches = matches
    
        // Return compact summary table
        const lines = matches.map((m, i) => {
          return `| ${i + 1} | ${m.displayTitle} | ${m.matchPercentage}% | ${m.region}${m.country ? ` (${m.country})` : ''} | ${m.funding_type ?? '-'} | ${m.estimated_value ?? '-'} | ${m.deadline ?? 'TBD'} |`
        })
    
        const table = [
          `# GovRider Search Results`,
          '',
          `Found ${matches.length} AI-ranked opportunities (scanned ${totalScanned?.toLocaleString() ?? '?'} active listings):`,
          '',
          '| # | Opportunity | Match | Region | Type | Value | Deadline |',
          '|---|-------------|-------|--------|------|-------|----------|',
          ...lines,
          '',
          '---',
          'These are the most similar opportunities found in GovRider\'s curated database, ranked by AI-assessed alignment to your description. Results may include opportunities from different countries or funding types than specified if closer matches were not available at this time. Database updated nightly from 25+ official government sources.',
          '',
          `Credits remaining: ${creditsRemaining ?? 'unknown'}`,
          '',
          'Use **get_opportunity** with a number (1-10) to see the full strategic fit memo, political context, description, and application URL for any match above.',
        ].join('\n')
    
        return {
          content: [{ type: 'text' as const, text: table }],
        }
      },
    )
  • The input schema for search_enriched using Zod validation. Requires a 'query' string (min 20 chars, max 10000) describing the technology/product/service to search for.
      description:
        'Full AI-powered government procurement search with Claude Sonnet intelligence. Returns a compact ranked summary of 10 matches showing title, match score, region, type, value, and deadline. Costs 1 credit. Always searches globally across all sources to find the best matches. After reviewing the summary, use **get_opportunity** with a result number (1-10) to see the full strategic fit memo, political context memo, description, and application URL for any match - at no extra cost.',
      inputSchema: {
        query: z
          .string()
          .min(20)
          .max(10000)
          .describe('Detailed description of the technology, product, or service (min 20 chars). Include any country, region, or sector context directly in the description. More detail = better matches.'),
      },
    },
  • src/index.ts:155-219 (registration)
    The registration of the search_enriched tool via server.registerTool() with name 'search_enriched', description, input schema, and handler.
    server.registerTool(
      'search_enriched',
      {
        description:
          'Full AI-powered government procurement search with Claude Sonnet intelligence. Returns a compact ranked summary of 10 matches showing title, match score, region, type, value, and deadline. Costs 1 credit. Always searches globally across all sources to find the best matches. After reviewing the summary, use **get_opportunity** with a result number (1-10) to see the full strategic fit memo, political context memo, description, and application URL for any match - at no extra cost.',
        inputSchema: {
          query: z
            .string()
            .min(20)
            .max(10000)
            .describe('Detailed description of the technology, product, or service (min 20 chars). Include any country, region, or sector context directly in the description. More detail = better matches.'),
        },
      },
      async ({ query }) => {
        const body: Record<string, unknown> = { query }
    
        const { ok, status, data } = await apiCall('/api/v1/search/enriched', body)
    
        if (!ok) {
          return { content: [{ type: 'text' as const, text: errorText(data, status) }], isError: true }
        }
    
        const matches = data.matches as Array<Record<string, unknown>>
        const totalScanned = data.total_scanned as number
        const creditsRemaining = data.credits_remaining as number | null
    
        if (!matches || matches.length === 0) {
          return {
            content: [{
              type: 'text' as const,
              text: `No opportunities found matching your query. Try broadening your search or removing filters.`,
            }],
          }
        }
    
        // Cache full results for get_opportunity
        cachedMatches = matches
    
        // Return compact summary table
        const lines = matches.map((m, i) => {
          return `| ${i + 1} | ${m.displayTitle} | ${m.matchPercentage}% | ${m.region}${m.country ? ` (${m.country})` : ''} | ${m.funding_type ?? '-'} | ${m.estimated_value ?? '-'} | ${m.deadline ?? 'TBD'} |`
        })
    
        const table = [
          `# GovRider Search Results`,
          '',
          `Found ${matches.length} AI-ranked opportunities (scanned ${totalScanned?.toLocaleString() ?? '?'} active listings):`,
          '',
          '| # | Opportunity | Match | Region | Type | Value | Deadline |',
          '|---|-------------|-------|--------|------|-------|----------|',
          ...lines,
          '',
          '---',
          'These are the most similar opportunities found in GovRider\'s curated database, ranked by AI-assessed alignment to your description. Results may include opportunities from different countries or funding types than specified if closer matches were not available at this time. Database updated nightly from 25+ official government sources.',
          '',
          `Credits remaining: ${creditsRemaining ?? 'unknown'}`,
          '',
          'Use **get_opportunity** with a number (1-10) to see the full strategic fit memo, political context, description, and application URL for any match above.',
        ].join('\n')
    
        return {
          content: [{ type: 'text' as const, text: table }],
        }
      },
    )
Behavior4/5

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

No annotations are provided, so the description must carry the full burden. It discloses credit cost (1 credit), global scope, output format (10 matches with specific fields), and AI intelligence used. It lacks details on idempotency or error handling, but for a search tool these are not critical.

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 moderately sized, front-loaded with the tool's purpose, then lists output specifics, cost, scope, and follow-up instructions. Every sentence adds value and is well-structured without repetition.

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 no output schema, the description adequately describes the output format (10 matches, fields). It also explains the next step (get_opportunity) and cost. It does not mention what happens if no matches are found, but overall is sufficiently complete for a search tool with one parameter.

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?

The single parameter 'query' has full schema description. The tool description adds semantic guidance: 'Include any country, region, or sector context directly in the description. More detail = better matches.' This adds value beyond the schema by advising on detail and context inclusion.

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 it is a government procurement search tool that returns a ranked summary of 10 matches with specific fields. It names sibling 'get_opportunity' for follow-up, but does not explicitly distinguish from sibling 'search_opportunities', so it is somewhat clear but not fully differentiated.

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 advises using get_opportunity after reviewing the summary, but does not provide explicit guidance on when to use this tool versus the alternative 'search_opportunities', nor does it describe any prerequisites or exclusions.

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

Install Server

Other Tools

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/carlosahumada89/govrider-mcp-server'

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