Content
# grant-radar
grant-radar is a REST/MCP service that collects government subsidy announcements, filters and examines announcements that match applicant conditions, and provides AI-based suitability and draft application judgment.
It's not just a list of announcements. Announcement texts are scattered, and support targets, business experience, regions, and attached forms vary by source. grant-radar organizes this information into one schema, excludes announcements that don't match, and leaves ambiguous announcements as `needs verification`. Then, it provides prompts for the caller-side LLM to perform suitability, support value, preparation, and draft writing.
## What does it do
- Collects announcements from K-Startup, Bizinfo, MSIT, and SMEs.
- Normalizes announcements by title, institution, field, applicant type, business experience, region, deadline, and attachment link.
- Combines duplicate announcements from multiple sources.
- Hides expired announcements from the active list.
- Determines basic qualifications by applicant type, business experience, and region.
- Returns `fitPrompt` and `draftPrompt` that can be executed directly by the LLM.
- Provides web app, public read REST API, and token-protected MCP endpoint.
This project does not call its own LLM. Caller-side models like ChatGPT, Claude, or Hermes receive grant-radar's results to make judgments and write.
## Demo
Currently operating instances.
| Surface | Address |
|---|---|
| Web App | `https://grant.sealcpa.com/` |
| REST List | `https://grant.sealcpa.com/api/grants` |
| Docs | `https://grant.sealcpa.com/docs/` |
| MCP | `https://grant.sealcpa.com/mcp` |
The read REST is public because government announcements are public data. MCP requires a Bearer token as an integrated surface for AI agents.
This repository is a public-safe source mirror. Secrets, deployment settings, and internal operation notes are not stored in the public tree.
## Quick Start
```bash
npm ci
cp .env.example .env
```
Fill in the API keys in `.env` and refresh the cache.
```bash
npm run refresh
npm run mcp
```
The default server address is `http://localhost:13280`.
## Environment Variables
| Variable | Required | Purpose |
|---|---:|---|
| `DATA_GO_KR_SERVICE_KEY` | Yes | data.go.kr API key for K-Startup, MSIT, and SMEs |
| `BIZINFO_CRTFC_KEY` | Yes | Bizinfo API key |
| `GRANT_RADAR_TOKEN` | Recommended | Bearer token for `/mcp`. If not set, the server generates one and adds it to `.env`. |
| `PORT` | No | HTTP port. Default is `13280`. |
| `GRANT_CACHE` | No | Cache file path. Default is `.cache/grants.json`. |
| `KSTARTUP_PAGE` | No | K-Startup page. Default is `1`. |
| `KSTARTUP_PER_PAGE` | No | K-Startup page size. Default is `30`. |
| `BIZINFO_SEARCH_CNT` | No | Bizinfo page size. Default is `30`. |
## REST Example
```bash
curl -G "https://grant.sealcpa.com/api/grants" \
--data-urlencode "applicantType=small and medium-sized enterprises" \
--data-urlencode "businessAgeYears=3" \
--data-urlencode "capability=AI-based logistics optimization SaaS" \
--data-urlencode "intent=early customer validation and business funding"
```
The response includes only `possible` or `needs verification` announcements. Clearly impossible announcements are excluded.
## MCP Tools
| Tool | Purpose |
|---|---|
| `match_grants` | Returns matching announcements, qualification reasons, and `fitPrompt`. |
| `get_grant` | Returns a specific announcement's detail link, attachments, and extracted text. |
| `draft_application` | Creates a draft writing prompt based on the announcement and user profile. |
Prompts are executed by the caller-side LLM, designed not to make up unknown facts but leave `[fillable slots]` for the user.
## Directory Structure
| Path | Role |
|---|---|
| `packages/core` | Collection adapters, normalization schema, cache, duplicate removal, qualification judgment, and prompt generation |
| `packages/mcp` | Express app, REST endpoints, and MCP server |
| `scripts/refresh.ts` | Updates `.cache/grants.json` with source data |
| `web/` | Static web UI and documentation viewer |
| `docs/` | User manual, API contract, source specification, and project map |
## Verification
```bash
npm test
```
Currently, 30 Node tests pass after `npm ci` on the local environment.
## Limitations
grant-radar is a tool to help with announcement exploration and draft application writing. It does not handle actual application submission, final legal/accounting judgments, or project expense management. Always verify the original announcement and attachments before applying.
No LLM API keys are required or stored.