sourcing
This server scrapes Google Maps for clinics/hospitals, discovers/verifies WhatsApp contacts, and exports lead lists.
Start a collection with keyword, country region, center coordinates, radius, grid size, limit, language, and optional website crawling.
Monitor progress with
check_collection, list all jobs, or cancel a running job while keeping collected records.Fetch leads filtered by status (
confirmed/candidate/unlikely) and limited to what you need, using either a job ID or an existing CSV path.Export Excel from collection results, including mid-run or cancelled jobs, via the raw JSONL ledger.
Check a single website for declared WhatsApp links (
wa.me/api.whatsapp.com) in seconds.Under the hood it can crawl business websites, verify WhatsApp profiles, classify phone numbers, and auto-resume interrupted collections.
Collects and verifies WhatsApp contact numbers for hospitals and clinics from Google Maps, crawling their websites to find wa.me links and classifying numbers by confidence.
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., "@sourcingCollect hospital and clinic WhatsApp leads in Jakarta and export to Excel"
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.
sourcing
구글 맵에서 병원·클리닉의 WhatsApp 연락처를 수집하는 CLI.
설치
Windows
mise는 Windows 지원이 제한적이라 쓰지 않는다. uv가 Python 3.13을 알아서
받아온다 (.python-version을 읽는다).
PowerShell에서:
# uv 설치 (이미 있으면 건너뛴다)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
git clone https://github.com/m2nho/sourcing.git
cd sourcing
uv sync # Python 3.13까지 알아서 받아온다
uv run playwright install chromium # 브라우저 (~200MB)
uv run pytest # 145개 통과하면 준비 완료uv를 설치한 창에서는 PATH가 아직 갱신되지 않았을 수 있다. 터미널을 새로
열고 uv --version이 되는지 확인한다.
macOS · Linux
mise install # Python 3.13 (mise.toml)
uv sync
uv run playwright install chromium
uv run pytestmise가 없으면 생략해도 된다 — uv sync가 Python을 알아서 잡는다.
Related MCP server: scrapercity-cli
사용
도시 하나를 제대로 훑기 (권장)
구글 맵은 뷰포트가 넓으면 같은 곳만 반복해서 돌려준다. 넓은 도시는 지구 단위로 나눠 돌리고 합쳐야 한다. 실측: 런던을 반경 10km로 한 번 돌리면 120곳, 8개 지구로 나누면 667곳이 나왔다.
scripts/sweep scripts/districts-london.txt "aesthetic clinic" GB london지구 목록은 이름|위도,경도|반경km|셀km 형식이다(scripts/districts-london.txt
참고). 순차로 돌고 마지막에 자동으로 합친다. 이미 결과가 있는 지구는
건너뛰므로 중간에 멈춰도 다시 실행하면 이어서 간다.
한 곳만 돌리기
uv run sourcing "klinik" --region ID --lang id --center=-6.2,106.8167
uv run sourcing "aesthetic clinic" --region GB --center=51.5205,-0.1490 --radius-km 2 --cell-km 1.5음수 좌표는 --center=처럼 =로 붙인다. 안 그러면 argparse가 옵션으로 오해한다.
--cell-km이 "검색 한 번이 몇 km를 볼지"다. 기본 4km이고 격자는 여기서
자동 계산된다. 클리닉이 밀집한 중심가는 1.5km까지 좁힌다.
--center 없이 실행하면 구글이 실행 위치 IP를 기준으로 검색한다. 특정
지역을 노리려면 좌표를 주거나 키워드에 지역명을 넣는다.
여러 결과 합치기
uv run sourcing-merge out/london-*.raw.jsonl --out out/london-ALL.xlsx지구 경계에 걸친 곳은 중복되므로 반드시 합쳐서 하나의 엑셀로 쓴다. 같은 곳이 여러 번 나오면 근거가 더 강한 쪽을 남긴다.
자세한 판단 기준은 .claude/skills/lead-sourcing/SKILL.md에 있다.
WhatsApp 상태
구글 맵에는 WhatsApp 필드가 없다. 이 도구는 근거를 밝힌 세 단계로 표시한다.
상태 | 근거 |
| 업체가 스스로 선언한 |
| 선언은 없지만 WhatsApp 프로필 조회로 확인된 번호. 프로필 이름이 상호와 맞는 것만 |
| 대표번호가 모바일 번호대 — 동남아에서는 대부분 WhatsApp이다. 추측이므로 |
| 유선이거나 번호가 없다 |
웹사이트 훑기
기본으로 켜져 있다. 장소에 웹사이트가 있으면 그 페이지를 브라우저로 열어
wa.me / api.whatsapp.com 링크를 찾고, 찾으면 confirmed로 승격시킨다.
맵 리스팅만으로는 확정이 거의 안 나오기 때문이다 — 실측 709건 중 1건이었다.
업체가 WhatsApp을 대표 채널로 쓰더라도 맵의 웹사이트 칸에는 홈페이지 주소를
넣고, wa.me 링크는 그 홈페이지 안(푸터·플로팅 버튼)에 둔다.
번호가 여러 개 나오면 각각을 별개 레코드로 저장한다. 부서·지점별로 번호를
따로 두는 곳이 실제로 있다. 추가 번호는 place_cid에 #1, #2가 붙어
중복 제거와 재개가 그대로 작동한다.
정적 HTML이 아니라 브라우저로 렌더링해서 받는다. WhatsApp 버튼을 JS 위젯으로 삽입하는 사이트가 흔해서, 원본 HTML만 봐서는 링크가 보이지 않는다(실측: 한 클리닉에서 정적 3개 → 렌더링 후 4개).
본문에 그냥 적힌 번호는 쓰지 않는다. "WA:" 같은 라벨로 추정할 수는 있지만 그것은 추측이고, 이 단계의 목적은 추측이 아니라 선언을 읽는 것이다.
사이트당 한 번 요청하므로 수집 시간이 대략 두 배가 된다. --no-crawl로 끄면
맵 정보만 쓰고 훨씬 빠르지만 confirmed는 거의 나오지 않는다.
미국·캐나다에서는 candidate가 나오지 않는다
북미번호계획은 지역번호로 유선/모바일을 나누지 않아 모든 번호가 "구분 불가"로
분류된다. 그 유형을 후보로 올리면 전부 후보가 되어 아무것도 걸러주지 못하므로
(실측: 마이애미 클리닉 304건 중 267건), +1 번호는 confirmed만 리드가 된다.
즉 미국에서는 웹사이트 훑기가 사실상 유일한 경로다.
Claude Desktop · Codex에서 쓰기
MCP 서버로 노출돼 있다. 두 클라이언트 모두 stdio MCP를 쓰므로 같은 서버를 쓴다.
Claude Code는 저장소의 .mcp.json을 그대로 읽으므로 별도 설정이 필요 없다.
Claude Desktop은 claude_desktop_config.json에 아래를 넣는다
(macOS ~/Library/Application Support/Claude/, Windows %APPDATA%\Claude\):
{
"mcpServers": {
"sourcing": {
"command": "uv",
"args": ["--directory", "<이 저장소를 클론한 절대경로>", "run", "sourcing-mcp"]
}
}
}Codex는 저장소의 .codex/config.toml을 그대로 쓴다 — 클론한 디렉터리에서
codex를 실행하면 바로 잡힌다. 전역으로 등록하려면 둘 중 하나를 쓴다.
codex mcp add sourcing -- uv --directory <클론한 절대경로> run sourcing-mcp또는 ~/.codex/config.toml에 직접:
[mcp_servers.sourcing]
command = "uv"
args = ["--directory", "<클론한 절대경로>", "run", "sourcing-mcp"]--directory로 프로젝트 경로를 명시해야 uv가 이 프로젝트의 가상환경을 찾는다.
Windows 경로는 JSON·TOML에서 역슬래시를 두 번 쓰거나 슬래시로 적는다:
"C:\\Users\\me\\sourcing" 또는 "C:/Users/me/sourcing".
툴
툴 | 하는 일 |
| 수집 시작. 즉시 반환한다 — 실제 수집은 20~40분 걸린다 |
| 진행 상황과 현재까지의 집계 |
| 이 세션의 작업 목록 |
| 중단. 수집한 레코드는 남아 재개할 수 있다 |
| 결과를 걸러서 읽는다. 레코드 전체가 아니라 필요한 만큼만 |
| 엑셀을 다시 뽑는다. 취소된 작업·예전 데이터·수집 도중 중간 결과 |
| 사이트 한 곳만 확인. 몇 초면 끝난다 |
수집이 오래 걸리므로 작업 방식으로 만들었다. 툴이 40분을 붙들고 있으면
클라이언트가 타임아웃되고 그동안 대화도 막힌다. start_collection은 job_id만
주고 바로 돌아오며, 진행률은 JSONL 파일에서 읽는다 — 레코드마다 flush되므로
그 파일이 곧 실시간 진행률이다.
get_leads가 레코드 전체를 돌려주지 않는 것도 같은 이유다. 200건을 컨텍스트에
쏟으면 토큰만 태운다. 요약과 집계를 주고, 필요한 만큼만 잘라 읽게 한다.
동시에 하나의 수집만 돈다. 브라우저가 하나뿐이고 동시 접속은 차단 위험을 키운다.
출력 파일
수집이 끝나면 세 파일이 나온다.
파일 | 용도 |
| 영업용 목록. 병원명·위치·전화번호·WhatsApp 링크·상태·근거 여섯 컬럼. 연락 가능한 곳만, 확정을 위로 정렬 |
| 전체 레코드 원본. 모든 컬럼 보존 |
| 재개용 원장. 레코드마다 즉시 flush된다 |
근거 컬럼
확정 안에도 신뢰도가 다른 것들이 섞인다. 어디부터 걸지 정할 수 있도록 출처를 남긴다.
근거 | 의미 |
홈페이지+맵 일치 | 홈페이지의 wa.me가 맵 대표번호와 같다 — 가장 강한 근거 |
홈페이지 링크 | 홈페이지에서 찾았고 맵에는 없던 번호. 실측상 확정의 3분의 2가 여기 |
구글맵 링크 | 맵 웹사이트 필드가 wa.me였다. 드물다 (709건 중 1건) |
맵 번호 추정 | 맵 대표번호가 모바일이라는 추정뿐. 검증되지 않았다 |
WhatsApp 프로필 조회
기본으로 켜져 있다. 수집한 번호를 wa.me에서 열어 프로필 이름이 뜨는지 본다.
등록된 비즈니스 계정이면 상호가 보이고, 미등록이거나 개인 계정이면 번호만
보인다. 메시지는 보내지 않는다 — 공개 페이지를 여는 것뿐이다.
이름이 상호와 맞으면 추측(candidate)이나 버려진 것(unlikely)을
verified로 올린다. 이미 선언이 있는 confirmed는 그대로 두고 프로필
이름만 참고로 남긴다. 이름이 안 맞으면 등급을 올리지 않되 이름은 기록한다 —
남의 번호일 수 있다는 신호다.
실측(런던 아이스테틱 120곳):
프로필 확인율 | |
| 80% |
| 53% |
버려졌던 | 9% (4건 회수) |
candidate의 절반은 실제로 등록돼 있지 않았다. 이 단계가 없으면 추측과
확인을 구분할 수 없다.
이름이 안 뜬다고 미등록인 것은 아니다. 비즈니스 프로필 없이 개인 계정으로 쓰면 번호만 보인다 — 이 수치는 늘 하한이다.
--no-verify로 끄면 건당 3초를 아낀다.
한계
구글 맵 검색 하나는 100~120건에서 잘린다. 지역 전수에 가깝게 가려면
--center/--radius-km/--grid로 격자를 쪼개야 한다.자동화된 스크래핑이라 구글이 확인 절차를 요구할 수 있다. 그때는
--headful로 실행해 창에서 직접 통과하면 세션이 프로필에 남는다.중단해도
*.raw.jsonl에 즉시 기록되므로 같은 명령을 다시 실행하면 이어서 받는다.reviews(리뷰 수) 컬럼은 현재 채워지지 않는다. 패널 HTML을 캡처하는 시점에 평점 블록의 리뷰 수 컨테이너가 비어 있어 파서가 가져올 값이 없다. 알려진 한계이며 후속 작업 대상이다 — CRM에 빈 값으로 들어가도 버그가 아니다.
개발
uv run pytestmaps.py(브라우저 계층)를 뺀 나머지는 전부 네트워크 없이 테스트된다.
구글이 DOM을 바꾸면 parse.py의 셀렉터 상수와 tests/fixtures/만 갱신하면 된다.
Available Tools
7 toolscancel_collectionB
돌고 있는 수집을 중단한다. 그때까지 수집한 레코드는 그대로 남는다.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It usefully reveals that previously collected records are preserved, which is the main side-effect concern for a cancel operation. However, it does not state whether cancellation is reversible, what happens to the job status, or what response the caller should expect.
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 one compact sentence with the main action front-loaded and the key side effect stated immediately after. There is no redundant or filler content.
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 single-parameter cancel tool with no output schema, the description covers the core purpose and the most important behavioral consequence. It could have added guidance on where to find job_id or how to verify the job state afterward, but given the low complexity, this is a minor gap rather than a serious omission.
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 0%, and the description never mentions job_id at all. The parameter name is fairly self-explanatory, but the description does not explain where to obtain the job ID or that it must refer to an actively running collection, so it fails to compensate for the missing schema-level documentation.
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 states a specific action: stopping a running collection ('돌고 있는 수집을 중단한다') and adds the meaningful outcome that already-collected records remain. This clearly distinguishes it from sibling tools like start_collection and check_collection, though it does not explicitly reference them.
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 phrase '돌고 있는' (running) implies the tool should be used on an in-progress collection, but there is no explicit guidance about when not to use it or which sibling tool should be used instead. Usage context is present but only implicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_collectionA
수집 작업의 진행 상황과 현재까지의 집계를 돌려준다.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the core behavior (returning progress/aggregation), implying a read-only status check, but it does not mention behavior on unknown/completed jobs, output shape, or polling suitability.
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?
One short sentence conveys the essential operation with no filler. The key concept (progress) is front-loaded before the aggregation detail.
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 one-parameter status tool this is usable, but without annotations or an output schema the agent still lacks information about the return format, error behavior, and the relationship to sibling lifecycle tools (start/list/cancel).
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 coverage is 0%, but there is only one required parameter, job_id, whose name is self-explanatory. The description adds context by tying the job to a '수집 작업' (collection job), though it does not explain where to obtain job_id or its format.
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 clear verb ('돌려준다' = returns) and identifies the resource: progress and current aggregation of a collection job. This distinguishes it from start_collection/cancel_collection/list_collections implicitly, though it does not name any sibling explicitly.
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 this is a monitoring/status tool for an ongoing collection job, but it gives no explicit guidance on when to use it instead of list_collections or check_site_whatsapp, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_site_whatsappA
웹사이트 한 곳을 열어 선언된 WhatsApp 번호를 찾는다. 몇 초면 끝난다.
업체가 href에 넣어둔 wa.me / api.whatsapp.com 링크만 읽는다. 본문에 적힌 맨 번호는 WhatsApp인지 알 수 없으므로 쓰지 않는다.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly states that only href links matching wa.me/api.whatsapp.com are read and that body-text numbers are ignored because their WhatsApp validity is unknowable. This is a key limitation. It does not mention side effects or output, but the dominant behavior is clearly disclosed.
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 concise and front-loaded with the core action. The second paragraph adds essential boundary information about href-only reading. The phrase 'takes a few seconds' is slightly extraneous but does not detract overall.
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 single-parameter read tool with no output schema, the input and processing are well described. However, the description does not state what the tool returns when a number is found nor what happens when no matching link exists. Since there is no output schema, this leaves a meaningful gap in the agent's ability to interpret the result.
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 schema has one 'url' parameter with no description (0% coverage), so the description must compensate. It does clarify that the URL is the website to open and check, but it adds no format constraints, protocol expectations, or invalid-URL behavior. The parameter meaning is recoverable from the tool action, but barely beyond the parameter name itself.
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 and resource: 'opens one website and finds the declared WhatsApp number.' It also precisely scopes the method—reading only wa.me/api.whatsapp.com href links—which clearly separates this tool from the broader collection/export siblings.
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?
There is no explicit guidance on when to use this tool versus alternatives like check_collection or get_leads. No context, prerequisites, or exclusions are mentioned, so the agent is left to infer its role in a larger workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_excelA
수집 결과를 엑셀(.xlsx)로 다시 뽑는다.
수집이 정상으로 끝나면 엑셀은 자동 생성된다. 이 툴은 그러지 못한 경우를 위한 것이다 — cancel_collection으로 중단해 마무리 코드에 도달하지 못했거나, 예전에 모은 데이터를 지금 형식으로 다시 만들고 싶을 때.
재개 원장(.raw.jsonl)에서 만들므로 수집 도중에도 현재까지의 결과를 뽑을 수 있다.
Args: job_id: start_collection이 준 작업 id. csv_path: 결과 CSV 경로. job_id 대신 쓸 수 있고, 이전 세션의 결과에 쓴다. out_path: 저장할 .xlsx 경로. 비우면 CSV와 같은 이름으로 나란히 만든다.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | ||
| csv_path | No | ||
| out_path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden. It discloses that the tool builds from the .raw.jsonl resume ledger, can run mid-collection, and creates the xlsx alongside the CSV by default. It does not mention overwrite behavior or error cases, but the provided context is substantial for an export 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 well-structured and front-loaded: the purpose appears in the first sentence, followed by use-case context, source behavior, and an Args section. Every sentence adds meaningful guidance without redundant repetition of the schema.
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?
The description covers the primary use cases, data source, and all parameter semantics, which is sufficient for an export tool without an output schema. Minor ambiguity remains about precedence if both job_id and csv_path are provided, and what happens when all parameters are empty.
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 0%, and the description fully compensates by explaining each parameter: job_id is the start_collection work id, csv_path can substitute for job_id, and out_path controls the .xlsx save location with a default behavior when empty. This adds essential meaning beyond the bare schema.
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 the tool re-extracts collection results into Excel (.xlsx), with a specific verb and resource. It also distinguishes the tool from the automatic Excel generation that happens on normal collection completion, and from sibling tools like cancel_collection and start_collection.
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 explicitly defines when to use the tool: when auto-generation did not occur, when a collection was interrupted by cancel_collection, when regenerating old data in the current format, or during collection to get partial results. It implies it is unnecessary when collection completes normally, giving a when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leadsA
수집 결과를 읽는다. 레코드 전체가 아니라 필요한 만큼만 돌려준다.
엑셀 파일(.xlsx)은 수집이 끝나면 CSV와 나란히 자동 생성된다. 병원명·위치· 전화번호·WhatsApp 링크·상태·근거 여섯 컬럼이며 연락 가능한 곳만 담는다.
Args: job_id: start_collection이 준 작업 id. csv_path 대신 쓸 수 있다. csv_path: 결과 CSV 경로. 이전 세션의 결과를 읽을 때 쓴다. status: 'confirmed'(업체가 선언한 확정 번호) / 'candidate'(모바일 번호 추측) / 'unlikely'. 비우면 전부. limit: 최대 반환 건수.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| job_id | No | ||
| status | No | ||
| csv_path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral transparency burden. It discloses that the operation reads results, that Excel is auto-generated alongside CSV after collection, and that only contactable records appear. It does not discuss edge cases such as empty results or errors, but it provides meaningful behavioral context beyond a simple read statement.
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 compact and well-structured: it leads with the core purpose, then adds one useful behavioral note, then gives clear parameter semantics. Every sentence contributes information needed to use the tool correctly, with no repetition 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 no output schema and no annotations, the description covers the key aspects an agent needs: what the tool reads, how to reference a job or file, status filtering, and result column structure. It is slightly incomplete because it does not explicitly describe the returned data shape for the API call itself, but the provided context is sufficient for most calling scenarios.
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 coverage is 0%, yet the description documents every parameter in its Args section: job_id is the task id from start_collection, csv_path reads previous sessions, status defines the three allowed values, and limit caps the return count. This fully compensates for the bare schema.
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 opens with a specific action ('수집 결과를 읽는다') and identifies the resource as collection results, also clarifying that it returns only a subset rather than all records. However, it does not explicitly distinguish itself from siblings like export_excel or check_collection, so it stops short of full sibling differentiation.
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 clear context for when to use job_id versus csv_path, and explains that status and limit control the returned set. It does not state explicit when-not-to-use guidance or name alternative tools, but the parameter-level usage conditions are genuinely helpful for an agent deciding how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionsB
이 세션에서 시작한 수집 작업들.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, but it is a bare noun phrase that discloses only the session scope. It does not state whether the call is read-only, what 'session' means, whether results persist, or what the response shape is. The agent is left to assume safe read behavior without any confirmation.
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?
A single compact phrase in Korean with no filler words, and the session-scope qualifier is front-loaded. It is appropriately brief for a zero-parameter tool, though the brevity borders on under-specification rather than deliberate economy.
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 zero-parameter list tool this is nearly adequate, but key context is missing: the definition of 'session' is never explained, and with no output schema the agent cannot anticipate the response structure or empty-list behavior. The description covers scope but leaves the rest to inference.
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 tool takes zero parameters and schema coverage is trivially 100%, so per the rubric the baseline is 4. There are no arguments for the description to clarify, and it appropriately does not invent any.
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 identifies the resource precisely — 'collection tasks started in this session' — and the 'list' verb is carried by the tool name itself. The session-scope qualifier adds a meaningful boundary beyond a generic collections listing. It is clear but does not explicitly differentiate against sibling tools such as check_collection, so it falls short of a 5.
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 offers no guidance on when to choose this tool over start_collection, check_collection, or cancel_collection. It states only an output scope ('started in this session') with no exclusions, conditions, or named alternatives. An agent must infer all selection logic from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_collectionA
구글 맵에서 병원·클리닉을 수집하고 WhatsApp 연락처를 찾는 작업을 시작한다.
즉시 반환한다. 실제 수집은 20~40분 걸리므로 check_collection으로 진행을 확인하라.
Args: keyword: 검색어. 현지어가 훨씬 잘 나온다 (인니 'klinik', 베트남 'phòng khám'). 실측상 종합병원('rumah sakit')보다 클리닉('klinik')의 수확률이 5배 높다. region: 전화번호 정규화 기준 ISO 국가코드 (ID, VN, PH, US ...). lat: 검색 중심 위도. 도시명을 좌표로 바꿔서 넘겨라. lng: 검색 중심 경도. radius_km: 격자가 덮을 반경. grid: 한 변의 타일 수. 구글 맵은 검색당 약 120건에서 잘리므로 넓은 지역은 격자로 쪼갠다. limit: 수집할 최대 장소 수. 0이면 제한 없음. lang: 구글 맵 UI 언어. crawl: 웹사이트를 훑어 WhatsApp 링크를 찾을지. 끄면 훨씬 빠르지만 confirmed가 거의 나오지 않는다 (실측 0.5% 대 47%).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lng | Yes | ||
| grid | No | ||
| lang | No | en | |
| crawl | No | ||
| limit | No | ||
| region | Yes | ||
| keyword | Yes | ||
| radius_km | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden. It honestly discloses that the function returns immediately while the real work takes 20–40 minutes, and that disabling crawl is faster but drastically reduces confirmed results. This is valuable async-behavior context beyond the schema.
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 front-loaded with the core action and async behavior, followed by a well-organized Args list. Each line adds practical value, especially the measurements and field tips, so no sentence feels wasted for a 9-parameter tool.
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?
The description is strong for parameters and async behavior, but it does not specify what the immediate return value contains. Since there is no output schema and the agent likely needs a collection ID to pass to check_collection or cancel_collection, this is a meaningful gap in an otherwise complete 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 0%, so the description must fully explain parameters. It does: keyword includes language and empirical yield tips, region is tied to phone normalization, lat/lng requires coordinates, grid explains Google Maps' ~120-result truncation, and crawl quantifies the tradeoff. Every parameter receives meaningful, actionable guidance.
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 states a specific action: starting a Google Maps collection of hospitals/clinics while looking for WhatsApp contacts. It clearly distinguishes start_collection from its siblings like check_collection and cancel_collection by emphasizing that it launches a long-running task and returns immediately.
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 explicit guidance to use check_collection to monitor progress, and explains practical tradeoffs like crawl on/off affecting speed and confirmed-rate. It does not exhaustively contrast with all siblings, but the key alternative flow is clearly indicated.
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.
7 tool updates
v0.1.0- First observed
cancel_collection - First observed
check_collection - First observed
check_site_whatsapp - First observed
export_excel - First observed
get_leads - First observed
list_collections - First observed
start_collection
TDQS
The async job lifecycle tools (start/check/list/cancel_collection) are clearly distinct, as are get_leads and export_excel. The only mild confusion is the shared 'check_' prefix on check_collection (job progress) and check_site_whatsapp (single website lookup), and list_collections overlapping somewhat with check_collection in purpose, but descriptions resolve these adequately.
All tools follow a verb_noun snake_case pattern (start_collection, cancel_collection, get_leads, export_excel), which is predictable and readable. Minor deviations: list_collections uses plural while other collection tools use singular, and check_site_whatsapp is a compound noun rather than a simple object.
Seven tools is well-scoped for the stated purpose of bulk Google Maps lead collection. Each tool earns its place: four for the async job lifecycle, one for reading results, one for single-site WhatsApp verification, and one for Excel export recovery.
The tool set fully covers the collection lifecycle: start, check progress, list jobs, cancel (with preserved partial results), read leads, verify a single site, and export to Excel even after cancellation. Cross-session access via csv_path is a thoughtful touch that prevents dead ends.
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
Local business lead extraction with email + phone enrichment from Google Maps.
B2B lead generation from Google Maps: search, dedupe and email-enrich businesses. Needs API key.
Google Maps scraper that extracts business contact details: emails, phone numbers, addresses…
Verified local-business leads: search any niche + city, query your library, export to your CRM.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables comprehensive LinkedIn profile search, data extraction, and contact enrichment using Google Search, Apollo.io, and AI-powered analysis. Includes automated data mining workflows with database storage and CSV export capabilities.3-

scrapercity-cliofficial
AlicenseBqualityCmaintenanceB2B lead generation MCP server with 20+ lead generation tools - Apollo scraping, Google Maps, email finder, email validator, mobile finder, skip trace, ecommerce store data, and more.25671MIT- AlicenseAqualityBmaintenanceEnables AI assistants to scrape Google Maps business data (names, addresses, phones, emails, websites, ratings, etc.) through natural language queries, with tools for synchronous and asynchronous scraping and credit checking.4493MIT
- FlicenseAqualityCmaintenanceA server that enables searching and prospecting businesses from Google Maps, filtering by website presence, extracting reviews, detecting social media links, and generating prompts for Claude Code to build landing pages.5-
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/m2nho/sourcing'
If you have feedback or need assistance with the MCP directory API, please join our Discord server