Skip to main content
Glama

CS 개념 온톨로지 · 오답 진단 에이전트

독학사 「통합컴퓨터시스템」 문제집을 개념 147개와 선행 관계 222개로 된 온톨로지로 다시 엮고, 그 지도를 따라 틀린 문제의 진짜 원인(막힌 선행 개념)을 거꾸로 찾는 진단 에이전트를 만들었습니다. 같은 지식 지도를 MCP 서버로 열어 두어서, 어떤 AI 에이전트든 연결해 쓸 수 있습니다.

  • 웹 데모: docs/index.html (GitHub Pages로 바로 열림)

  • MCP 서버: src/server.js

왜 만들었나

시험을 준비하면서 개념은 외웠는데 문제가 조금만 바뀌면 풀지 못했습니다. 틀린 문제를 다시 보니 원인은 그 문제가 아니라 그 밑에 깔린 선행 개념에 있었습니다. 개념 하나하나보다 개념 사이의 연결이 없었던 것입니다.

그래서 개념과 연결을 데이터로 만들고(온톨로지), AI가 그 연결을 따라 판단하게 했습니다. AI 에이전트가 잘 일하려면 문서 조각이 아니라 관계가 정의된 맥락이 필요하다는 것을 직접 확인한 프로젝트입니다.

Related MCP server: leap-mcp

구조

flowchart LR
  A[개념탐색표<br/>마크다운] -->|scripts/build_ontology.py| B[(ontology.json<br/>개념 147 · 관계 222)]
  B --> C[추론 엔진<br/>src/ontology.js]
  C --> D[웹 데모<br/>계보·전체 지도·오답 진단]
  C --> E[MCP 서버<br/>도구 6개 + 스키마]
  E --> F[Claude Desktop · Claude Code<br/>다른 MCP 에이전트]

온톨로지 스키마

클래스

수

관계

Concept

147

Concept ─prerequisite_of→ Concept (222)

Chapter

22

Concept ─belongs_to→ Chapter

ExamItem

253

Concept ─tested_by→ ExamItem (교재 200문항 중 196개 연결)

개념마다 왜 생겼나 / 핵심 / 계산 이유 / 중요도(별 1~5) / 출제 확률(추정)을 속성으로 가집니다.

데이터 검증 (scripts/build_ontology.py)

  • 순환 관계 0개 (위상 정렬 성공, DAG)

  • 선행·다음 기록이 양방향으로 222개 모두 일치

  • 원본 표의 중요도 분포(★5 27 · ★4 27 · ★3 48 · ★2 38 · ★1 7)와 일치

오답 진단은 이렇게 추론합니다

  1. 틀린 문제 번호 → tested_by로 문제가 묻는 개념을 찾습니다.

  2. 그 개념들의 선행 개념을 모두 모아, 여러 개념이 공통으로 기대는 가장 구체적인 선행 개념을 고릅니다. (공유 수가 같거나 큰 다른 후보의 조상이면 뺍니다.)

  3. 학생에게 그 개념을 설명할 수 있는지 묻습니다. 알면 그 개념과 조상을 지우고, 헷갈리면 그 밑으로 더 파고듭니다.

  4. 가장 깊은 "헷갈림" 개념을 막힌 지점으로 보고, 거기서 틀린 개념까지 이어지는 길을 복습 순서로 냅니다.

MCP 도구

도구

하는 일

search_concepts

낱말로 개념 찾기

get_concept

개념 정의·중요도·출제 정보·앞뒤 개념

get_prerequisite_path

선행 개념 전체를 깊이별로

find_concepts_for_exam_items

문제 번호 → 개념

rank_shared_prerequisites

여러 개념의 공통 선행 개념 순위

diagnose_wrong_answers

다단계 오답 진단 (질문 → 답 반영 → 복습 순서)

리소스: ontology://schema (클래스, 관계, 규모)

실행

npm install
npm test        # 서버를 띄워 6개 도구를 실제로 호출하는 확인

Claude Code에 연결

claude mcp add cs-ontology -- node /절대경로/cs-ontology-agent/src/server.js

Claude Desktop에 연결: claude_desktop_config.example.json 내용을 설정 파일에 넣습니다.

연결한 뒤 이렇게 말하면 됩니다.

교재 056, 093, 065, 113번을 틀렸어. 오답 진단해 줘.

웹 데모

docs/index.html 하나로 동작합니다. 저장소 설정에서 GitHub Pages를 main 브랜치의 /docs로 켜면 링크로 열 수 있습니다.

  • 계보 보기: 개념을 고르면 이해하는 데 필요한 선행 개념이 위에서 아래로 펼쳐집니다.

  • 전체 지도: 147개 전체와 선택한 개념의 계보

  • 오답 진단: 위 추론을 화면에서 단계별로 진행합니다. Claude 안에서 열면 AI 코치가 같은 도구를 호출해 진단을 설명합니다.

데이터

source/concept-map.md는 교재 문제와 공식 평가영역을 분석해 직접 정리한 개념 표입니다. 교재 문제는 번호로만 참조하며 문제 본문은 담지 않았습니다. 출제 확률은 추정치입니다.

Available Tools

6 tools
diagnose_wrong_answers오답 진단A
Read-only

틀린 문제 목록으로 진단한다. 처음엔 items만 넣으면 공통 선행 개념과 학생에게 물어볼 다음 질문(next_question)을 준다. 학생의 답을 known(설명 가능) / confused(헷갈림) / asked(넘어감 포함 이미 물어본 것)에 넣어 다시 부르면, next_question이 null이 될 때 plan(막힌 지점, 복습 순서)을 준다.

NameRequiredDescriptionDefault
askedNo
itemsYes
knownNo
confusedNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds the genuinely useful behavioral fact that the tool is conversational/iterative and that the plan only materializes once next_question becomes null. It does not describe the shape of plan or what happens on malformed input, so the added context is moderate rather than rich.

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

Conciseness4/5

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

Three dense sentences, front-loaded with the purpose then the two-phase protocol in chronological order. No filler, though the parenthetical glosses make individual sentences long enough to require a second read.

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?

There is no output schema, so the description must explain return values — and it does, naming next_question and plan and the termination condition. The remaining gap is the internal structure of plan and the index semantics of the integer arrays, which an agent would still have to discover by calling.

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 0%, so the description must carry the parameter burden. It does define the three answer categories (known=설명 가능, confused=헷갈림, asked=넘어감 포함 이미 물어본 것), which is real value, but it never explains that these are integer arrays or how the integers relate to items — the most important ambiguity for actually invoking the tool.

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?

"틀린 문제 목록으로 진단한다" states a specific verb (진단한다) and resource (틀린 문제 목록), and the follow-up sentences make the multi-turn diagnostic flow concrete (next_question, then plan). It is clearly distinct from concept-lookup siblings like get_concept or get_prerequisite_path, though it never names or contrasts them explicitly.

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?

Gives unusually concrete call sequencing: first call with items only, then call again with known/confused/asked populated, and repeat until next_question is null. It does not name alternatives or state when a sibling (e.g. rank_shared_prerequisites) should be used instead, which keeps it below a 5.

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

find_concepts_for_exam_items문제 → 개념A
Read-only

교재 문제 번호("056"), 모의고사("모의1-22"), 공식 예시("예시06")를 받아 각 문제가 묻는 개념을 돌려준다.

NameRequiredDescriptionDefault
itemsYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the description only needs to add lookup semantics. It confirms the tool resolves each item to a concept, but says nothing about partial resolution, unknown IDs, or result ordering — behavior an agent would want to know about a batch resolver.

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?

A single sentence with the resource and its accepted formats front-loaded; every clause carries information and nothing is padding.

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?

For a one-parameter, no-output-schema tool, the input side is well covered but the return shape is never described — whether concepts come back parallel to the input list, as a dictionary keyed by item, or with unresolved items flagged. That missing mapping is the main completeness gap.

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 coverage is 0%, so the description must carry parameter meaning, and it does the essential part by enumerating the accepted string formats for `items`. It does not mention that the array is capped at 30 entries or whether mixed formats may be combined in one call, so the compensation is strong but incomplete.

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?

Names a concrete verb+resource pair (returns the concept each exam item asks about) and gives three concrete input formats ('056', '모의1-22', '예시06') that make the item→concept mapping unmistakable. It does not explicitly contrast itself with search_concepts or get_concept, so the sibling differentiation is only implicit.

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?

Usage is implied by the input formats shown: you call it when you have exam item IDs and need the underlying concepts. There is no explicit 'use this instead of X when...' guidance and no statement about what to do with items that don't resolve, leaving the agent to infer routing.

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

get_concept개념 조회B
Read-only

개념 하나의 정의(왜 생겼나, 핵심, 계산 이유), 중요도, 출제 정보, 바로 앞 개념, 바로 열리는 개념을 돌려준다.

NameRequiredDescriptionDefault
idYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, so the safety profile is already covered. Because no output schema exists, the description carries the return-value burden and does so by enumerating five distinct returned elements, including the immediate predecessor and immediately unlocked concept in the graph. It does not state behavior for a nonexistent id, which is the main remaining gap.

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

Conciseness4/5

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

It is a single tightly packed sentence with the resource front-loaded and the returned contents listed afterward, with no filler. The parenthetical unpacking of '정의' adds useful detail at low cost, though the enumeration grows slightly dense.

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?

For a simple one-parameter read tool this covers the return payload reasonably, which matters since there is no output schema. However, the shape of fields like '중요도' and '출제 정보' remains undefined, and nothing is said about failure when the id does not exist.

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

Parameters2/5

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

The single 'id' parameter has 0% schema description coverage, so the description should explain what the id identifies and where it comes from (for example, an id returned by search_concepts). Instead it says nothing about the parameter, leaving the agent to infer that it is a concept identifier.

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 uses a specific verb-plus-resource ('개념 하나의 ... 돌려준다') and enumerates what the single concept record contains: definition rationale, core, calculation reason, importance, exam info, and adjacent concepts in the graph. This clearly separates it from search_concepts, which returns multiple matches. It does not explicitly name a sibling as the alternative, keeping it below a 5.

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?

There is no statement about when to use this tool versus search_concepts, get_prerequisite_path, or the other siblings, and no prerequisites such as needing an id from a prior search. Usage is only inferable from the singular 'id'-based shape. No exclusions or routing guidance are given.

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

get_prerequisite_path선행 경로B
Read-only

개념 하나를 이해하는 데 필요한 모든 선행 개념을 깊이별로 돌려준다. L0이 출발점이다.

NameRequiredDescriptionDefault
idYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that — results are grouped by depth and L0 is the starting point — but it leaves open whether the traversal is transitive to all ancestors or only immediate prerequisites, and what the grouped return shape looks like despite there being no output schema.

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

Conciseness4/5

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

Two short sentences, front-loaded with the core action and followed by the L0 orientation detail. No filler, though the second sentence is terse enough to border on cryptic.

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?

With no output schema, the description carries the return-value burden and only partially meets it: '깊이별' and 'L0이 출발점' hint at the structure but do not clarify whether L0 is the target concept itself or the first prerequisite ring, nor whether the result is a flat list or nested levels. Adequate to attempt a call, not complete enough to interpret the response 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?

Schema description coverage is 0%, so the single required 'id' parameter is undocumented in the schema. The description only implies via '개념 하나' that the id identifies a concept, without stating the ID domain, valid range, or behavior on unknown IDs — minimal but not zero compensation.

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 states a specific verb and resource: it returns all prerequisite concepts needed to understand a given concept, grouped by depth. This is distinguishable in kind from siblings like get_concept (single concept) and rank_shared_prerequisites, although the description never names those siblings to sharpen the contrast.

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?

There is no explicit when-to-use or when-not-to-use guidance, and none of the closely related siblings (get_concept, rank_shared_prerequisites, find_concepts_for_exam_items) are referenced. The learning-path use case is only inferable from the phrase '개념 하나를 이해하는 데 필요한'.

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

rank_shared_prerequisites공통 선행 개념B
Read-only

개념 여러 개가 공통으로 기대는 가장 구체적인 선행 개념을, 공유하는 개념 수가 많은 순서로 돌려준다.

NameRequiredDescriptionDefault
idsYes
limitNo

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: results are limited to the most specific shared prerequisites and are sorted by how many input concepts share them. It does not disclose the cap/truncation behavior, empty-result handling, or the default for the limit parameter.

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

Conciseness4/5

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

A single front-loaded sentence with no filler, stating the result and the ordering rule in one pass. It is efficient, though extremely short given the 0% schema coverage it is compensating for.

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?

With no output schema, the description does explain what comes back conceptually (prerequisite concepts, ranked by shared count), which is the key missing piece. However, for a tool with fully undocumented parameters and no field-level return detail, it still leaves meaningful gaps an agent would need in order to call and interpret it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, with two undocumented parameters (ids: array of 1–30 integers, limit: 1–20), so the description must carry the burden and largely does not. It only hints that several concept IDs are supplied ("개념 여러 개"), giving no indication of what ids accept or what limit controls or defaults to.

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 names a specific verb (돌려준다 / returns) and a precise resource — the most specific prerequisite concepts shared by multiple given concepts — plus the ordering rule (descending by number of sharing concepts). This clearly separates it from siblings like get_prerequisite_path (a path for one concept) and search_concepts (lookup by text).

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?

There is no explicit statement of when to use this instead of get_prerequisite_path or search_concepts, and no preconditions or exclusions. Usage is only inferable from the fact that it takes several concepts and returns their common ancestors, which leaves the agent to guess at routing.

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

search_concepts개념 검색A
Read-only

낱말로 개념을 찾는다. 결과는 개념 id, 제목, 중요도(별 1~5). 예: "인터럽트", "캐시".

NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine value by stating the return fields (id, title, importance as 1–5 stars) in the absence of an output schema, but it discloses nothing about match semantics (substring vs. fuzzy), result ordering, or what happens when nothing matches.

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?

Three short sentences: purpose first, then return shape, then concrete examples. Every element contributes and nothing is padded.

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 two-parameter read-only search with no output schema, the description covers the essentials: what it searches, how to phrase the query, and what comes back. The remaining gaps are the undocumented limit parameter and unstated matching/ordering behavior, both minor but non-zero for an agent tuning result counts.

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 0%, so the description must carry the parameter burden. It does so partially for query by framing it as a single word and giving keyword examples, which is real added meaning beyond "type: string", but the limit parameter (1–20) is never mentioned, leaving its purpose and default undocumented anywhere.

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?

"낱말로 개념을 찾는다" gives a specific verb (find) and resource (concepts) plus the search key (a word), which implicitly distinguishes it from get_concept (id-based retrieval). It never names the sibling, so an agent must infer that get_concept is the id-lookup counterpart rather than being told.

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 phrase "낱말로" implies the entry condition: use this when you have a keyword rather than an id. The two examples ("인터럽트", "캐시") reinforce the keyword use case, but there is no explicit when-not guidance and no mention of find_concepts_for_exam_items or other siblings as alternatives.

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.

  1. 6 tool updatesv0.1.0
    • First observeddiagnose_wrong_answers
    • First observedfind_concepts_for_exam_items
    • First observedget_concept
    • First observedget_prerequisite_path
    • First observedrank_shared_prerequisites
    • First observedsearch_concepts

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct operation: search vs. single-concept retrieval, single-concept prerequisite path vs. multi-concept shared prerequisites, exam-item mapping vs. wrong-answer diagnosis. The prerequisite-related tools are separated by single vs. multiple concepts, and the diagnostic tool is clearly a workflow wrapper rather than a duplicate.

Naming Consistency5/5

All names use snake_case and follow a verb_noun pattern (search_concepts, get_concept, get_prerequisite_path, find_concepts_for_exam_items, rank_shared_prerequisites, diagnose_wrong_answers). Verb choices vary appropriately by action while the convention remains predictable.

Tool Count5/5

Six tools are well-scoped for a read-only concept-ontology/diagnostic server; each covers a distinct part of the workflow (search, inspect, prerequisite traversal, exam mapping, shared-prerequisite ranking, diagnosis). No tool appears redundant or missing at the count level.

Completeness4/5

The surface covers the core diagnostic workflow and concept/prerequisite/exam lookups, but there is no browse/list-all-concepts operation and no reverse dependency traversal (concepts that depend on a given concept). These are minor gaps an agent can often work around via search and get_concept.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables LLM agents to query a structured knowledge library for search, explanations, related concepts, learning paths, examples, and cross-domain references via MCP.
    Apache 2.0
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents to act as a state-driven tutoring engine over MCP, with server-side mastery estimation, prerequisite checks, evidence-based assessment, and FSRS spaced review scheduling.
    58
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to search and traverse the 2022 revised Korean elementary curriculum across 11 subjects, 620 achievement standards, and 2,293 prerequisite relationships. It also supports reverse diagnosis of foundational learning gaps and generates personalized remedial learning roadmaps.
    85 npm
    3
    MIT