ir-search: a Korea-only government grant survey skill for coding agents
🇰🇷 한국 정부 지원사업 전수조사 에이전트 스킬 [Claude Code·Codex·agy(Antigravity)·Cursor·Gemini CLI·Grok Build 지원] K-Startup·기업마당·NIPA·KOCCA·SMTECH 크롤링 + 즉시/로드맵/변형 3분류 (Korea-only)
At a glance
- What is it?
- ir-search is a Python skill that crawls five Korean funding portals, filters them against a project profile, and returns a three-tier report. It is narrow by design, and the README says so.
- Who is it for?
- Adopt ir-search if you are building in Korea and already work inside one of the supported agents, because the source list and the A/B/C grouping match how Korean grant eligibility actually behaves.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 50 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 17, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The grant-matching problem ir-search was built for
Keyword search fails on Korean government grants for a structural reason. A team building an AI voice product does not match the word 'content', so a KOCCA production-support call never surfaces, even though the same team could apply if it described its work as an audio content pipeline. The README makes this argument directly: it lists content-production support, art-and-technology residencies, and social-service startup programmes as things an 'AI startup' can qualify for but cannot find by typing its own category into a search box.
The intended user is a founder or a small team inside Korea, at pre-incorporation or early stage, who needs to know which of the currently open calls they can actually enter. The output is not a list of links. It is a report split into three groups: group A, apply now with your current status, sorted by deadline; group B, opens once a trigger is met, such as incorporating a company or closing an investment; group C, reachable if you reframe the item, with the framing angle and its risk stated. A separate section records confirmed absences, so you learn that a programme is not currently open rather than assuming you missed it. Every entry carries the original notice URL, and the README states that information absent from a notice is marked as unknown instead of being inferred.
How the crawl, the profile and the three groups fit together
The repository is a skill, not an application. `SKILL.md` at the root is symlinked so that a clone directory is recognised as a skill folder, and `gemini-extension.json` lets Gemini CLI discover the same `skills/` tree. The work is split across scripts under `skills/ir-search/scripts/`: `kstartup_crawl.py` handles K-Startup and can call the official data.go.kr open API, `sources_crawl.py` handles bizinfo, NIPA, KOCCA and SMTECH, and `scope_plan.py` fixes the survey scope before anything is fetched.
Scope planning runs first and is deliberately offline. According to the README, `scope_plan.py` calls no network, no API and no LLM, so it consumes no tokens and no external quota. It produces an execution plan that separates automatic collection from manual checks and candidate sources, plus a stable `scope_fingerprint`. That fingerprint matters for repeat runs: the README states that a re-survey only declares an opportunity as gone when the fingerprint is identical and collection is complete, so changing the scope does not get misread as a programme disappearing.
On the K-Startup side there is a coverage-honesty mechanism worth noting. If a data.go.kr service key is present, the crawler uses the official API and, when the dataset is exhausted in registration order, records `stop_reason: api` and exits 0. If the API only returns a recent window, it records `stop_reason: api-window` and exits 2, which the README describes as partial. Full coverage is treated as the crawler's job, and a partial run will not assert that anything has vanished. The key is read from `.env` at the repository root, from the `DATA_GO_KR_KEY` environment variable, or from `~/.config/data_go_kr_key`, and the README says it is never written to logs, errors or the command line. Bizinfo stays on crawling on purpose: its official API needs a separate `crtfcKey` issued by bizinfo itself, and the README states the crawler already gives full coverage there.
Installing ir-search and running a first survey
The one-line installer detects which supported hosts are present, installs for all of them, and clones into `~/.agents/skills/` when no CLI is found, which covers Cursor and Grok Build. It also handles the `curl_cffi` dependency.
curl -fsSL https://raw.githubusercontent.com/djfksjd/ir-search/main/install.sh | bashIf you prefer to install per host, Claude Code uses its plugin marketplace. Note the README's point that `curl_cffi` is installed automatically by the session-start hook on this path.
claude plugin marketplace add djfksjd/ir-search
claude plugin install ir-search@djfksjdCodex follows the same shape with its own commands.
codex plugin marketplace add djfksjd/ir-search
codex plugin add ir-search@djfksjdagy (Antigravity CLI) has no session-start hook, so the dependency is installed by hand. Gemini CLI is installed as an extension from the repository URL, and the README notes that the extension discovers the skills under `skills/` and loads `AGENTS.md` as context.
agy plugin install djfksjd/ir-search
agy plugin enable ir-search
pip3 install 'curl_cffi>=0.15'For Cursor or Grok Build, one clone into the shared skills directory is enough.
mkdir -p ~/.agents/skills
git clone https://github.com/djfksjd/ir-search.git ~/.agents/skills/ir-search
pip3 install 'curl_cffi>=0.15'With the skill installed, open your project folder in the agent and ask for a survey in plain language, or use `/ir-search` in Claude Code. The agent reads what it can from the folder, asks only about the missing items (startup stage, region, what you need), and then runs. The profile is saved to `ir-search-profile.md` in the project folder, so later runs ask only whether anything has changed.
You can also drive the scripts directly. Planning a recommended scope for an AI and R&D need writes a plan file, and the crawler commands write JSONL plus a details directory for full notice text.
python3 skills/ir-search/scripts/scope_plan.py \
--preset recommended --need ai --need rnd \
--out survey-20260730/scope-plan.json
python3 skills/ir-search/scripts/kstartup_crawl.py list -o all.jsonl
python3 skills/ir-search/scripts/kstartup_crawl.py detail 178481 -o details/
python3 skills/ir-search/scripts/sources_crawl.py list bizinfo -o biz.jsonlScope presets run from `quick` (K-Startup only) through `focused`, `recommended`, `all_registered` and `all_known` to `custom`, where you name sources with `--include`. What you should see after a run is a dated folder under `~/Documents/지원사업조사_<대상>_<날짜>/` holding the report markdown, raw JSONL and the full notice texts, with each notice entry carrying its source URL.
Where ir-search stops working
The geographic limit is explicit and enforced by the source list. The README opens with a warning that this covers Korean government and public-institution programmes only and does not handle other countries, and the five sources are all Korean portals. If your company is not Korean and not planning to incorporate there, the tool has nothing to return.
Coverage is uneven across sources, and the README is candid about it. Only K-Startup and bizinfo are described as automated; IRIS, IITP, NIA, KIAT, the export voucher programme, creative economy innovation centres and regional bodies are listed in `skills/ir-search/references/sources.md` as `manual` or `candidate`, and the README states they are not presented as successful crawls. So an `all_known` plan is a to-do list, not a result set.
The API path has a failure mode you have to read exit codes to catch. A K-Startup run that falls back to crawling, or that stops inside the API's recent window, is partial. The README says diffing will not declare an opportunity gone on a partial run, which is the safe behaviour, but it also means a run that looks clean may simply not have seen everything. Relying on the absence section without checking `stop_reason` is a mistake.
Finally, group C is judgement, not fact. Reframing an AI voice product as an audio content pipeline may make it eligible, and the README's own example attaches a risk to that move: the deliverable has to actually be content. The tool surfaces the angle and the risk; it does not decide whether you can live with the consequence.
ir-search compared with a general information retrieval tool
The name collides with an entirely different field. Most people arriving at the phrase 'ir search' mean either infrared search-and-track systems or information retrieval in the academic sense, and the related queries around IR peaks, IR frequency ranges and information retrieval processes belong to those subjects. ir-search is neither. It is a domain-specific collector with a fixed source registry and a fixed output format.
That is the real comparison. A general information retrieval or web-search pipeline gives you recall over an open corpus and leaves ranking and interpretation to you. ir-search inverts this: the corpus is five named Korean portals plus a registry of manual sources, and the interpretation is built in as the A/B/C split with deadlines and qualification checks against the original notice text. What you give up is breadth and any use outside Korea. What you get is a repeatable, diffable survey where a second run reports only new notices, changed deadlines and closed opportunities instead of re-reading 250-plus listings. If your problem is searching arbitrary text, this is the wrong tool and the README would agree. If your problem is knowing which Korean programmes you can enter this month, an open search engine is the wrong tool.
Maintenance, licence and what to verify before relying on it
The last push to the repository was on 2026-07-30, which is recent enough that the code is not stale. The repository is not archived. There are no retrieved releases, so installation is from the default branch, which means you are tracking `main` rather than a tagged version. The README does not document a rollback path, and the absence of releases means there is no version to pin to if a later commit changes the output schema.
Licensing is MIT. In practical terms that permits commercial use and modification, but MIT also means no warranty. Nothing in the repository promises that a notice's eligibility criteria are complete or current, and the README's own design choice of marking absent information as unknown instead of inferring it puts the verification burden on you. That is the honest arrangement, but it is not a compliance guarantee. This is not legal advice; if a grant decision turns on eligibility wording, read the original notice.
Upgrade cost is low in one sense and non-zero in another. The dependency is a single package, `curl_cffi`, and the host integration is thin (a plugin manifest, `gemini-extension.json`, `AGENTS.md`, and a symlinked `SKILL.md`). What changes over time is the source side: portal markup shifts, and bizinfo's separate `crtfcKey` requirement is exactly the kind of thing that pushes a source from automated to manual. The repository carries a smoke workflow under `.github/workflows/`, which is the signal to watch for crawl breakage.
Editorial conclusion
Adopt ir-search if you are building in Korea and already work inside one of the supported agents, because the source list and the A/B/C grouping match how Korean grant eligibility actually behaves. Skip it if you are outside Korea or want a general information retrieval tool: the README states the scope is Korean government and public-institution programmes only, and the search phrases that bring people here are mostly about infrared and information retrieval, which this is not. Before trusting a report, check the run's stop_reason value and confirm that the entries you care about carry a source URL rather than an 'unknown' marker.
Frequently asked questions
What is the process of IR in ir-search?
There is no IR process in the information-retrieval sense. ir-search fixes a survey scope with scope_plan.py, crawls the selected Korean portals into JSONL, verifies qualification against the full notice text, and sorts matches into apply-now, trigger-based and reframing groups.
Can you give me an example of an information retrieval system like ir-search?
ir-search is not a general information retrieval system. The README describes it as a Korea-only survey skill over K-Startup, bizinfo, NIPA, KOCCA and SMTECH, and it states that other countries' programmes are not covered.
What is the purpose of ir-search?
Its purpose is to find Korean government and public-institution support programmes a specific project can actually apply for. The README argues that keyword search misses eligible calls, so ir-search reviews sources exhaustively and groups results by what you can do now, later, or after reframing.
What is ir-search?
It is a plugin and skill for Claude Code, Codex, agy, Cursor, Gemini CLI and Grok Build that crawls K-Startup, bizinfo, NIPA, KOCCA and SMTECH and produces a three-group survey report for a project profile.
What is an ir searchlight in the context of this project?
It is unrelated. ir-search covers Korean government grant notices, not infrared or lighting hardware, and the README states the scope is Korean government and public-institution programmes only.
Community notes