Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Generic MCP server for any SCPI instrument over VISA, TCP or serial, with command allow/deny lists.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
LABMCP_ADDRESS, LABMCP_SIMULATE, LABMCP_READ_ONLY, LABMCP_LIMITS필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"labmcp-scpi": {
"command": "uvx",
"args": [
"labmcp-scpi"
],
"env": {
"LABMCP_ADDRESS": "your-value",
"LABMCP_SIMULATE": "your-value",
"LABMCP_READ_ONLY": "your-value",
"LABMCP_LIMITS": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add labmcp-scpi --env LABMCP_ADDRESS=your-value --env LABMCP_SIMULATE=your-value --env LABMCP_READ_ONLY=your-value --env LABMCP_LIMITS=your-value -- uvx labmcp-scpi실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"labmcp-scpi": {
"command": "uvx",
"args": [
"labmcp-scpi"
],
"env": {
"LABMCP_ADDRESS": "your-value",
"LABMCP_SIMULATE": "your-value",
"LABMCP_READ_ONLY": "your-value",
"LABMCP_LIMITS": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"labmcp-scpi": {
"type": "stdio",
"command": "uvx",
"args": [
"labmcp-scpi"
],
"env": {
"LABMCP_ADDRESS": "your-value",
"LABMCP_SIMULATE": "your-value",
"LABMCP_READ_ONLY": "your-value",
"LABMCP_LIMITS": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
LABMCP_ADDRESS envLABMCP_SIMULATE envLABMCP_READ_ONLY envLABMCP_LIMITS env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검
레지스트리 이름이 GitHub 계정 K-Dense-AI 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.3)은 42일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Brontide agent arena
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:↓ 주간 다운로드i★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
THE MECH ARENA BUILT FOR AI AGENTS. HUMANS WELCOME. Pilot mech duels over MCP, free, no sign-in.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
Let an AI agent talk to any IEEE 488.2 / SCPI instrument: multimeters, oscilloscopes, source-measure units, power supplies, electronic loads, function generators, spectrum analyzers and counters. It works over GPIB, USBTMC, LAN (VXI-11, HiSLIP, raw socket) and RS-232. Because the agent writes raw SCPI, the server puts the safety in the plumbing. The read path accepts only single queries. Anything that changes the instrument goes through tools the MCP client asks you to confirm. You can give the server command allow and deny lists and a safe-state command of your own.
Keysight or Rohde & Schwarz instrument? Use the vendor's official MCP server instead: Keysight MCP Server for Instrument Control or the MCP server that ships with RsInstrument (
python -m RsInstrument.mcp).labmcp-scpicovers everything else: Tektronix/Keithley, Rigol, Siglent, SRS, Aim-TTi, B&K Precision, GW Instek, older HP/Agilent GPIB gear, and more.
| Package | labmcp-scpi |
| Instruments | Any instrument that speaks SCPI or IEEE 488.2 common commands |
| Interfaces | GPIB, USBTMC, LAN VXI-11 / HiSLIP (all via VISA), LAN raw socket (e.g. port 5025), RS-232 / USB-serial |
| Protocol | SCPI-99 / IEEE 488.2 (SCPI-99 standard, IVI Foundation); VISA via PyVISA |
| Status | 🧪 simulated: tested against a wire-level SCPI simulator, not yet verified on hardware. Report a hardware test |
uvx labmcp-scpi --simulate --check
The simulator is a small, generic bench instrument (*IDN? → LabMCP,SIM-DMM-PSU,SIM000001,1.0.0). It is a 0–30 V / 3 A supply driving a 100 Ω load, with a built-in DMM across the load. It supports MEASure:VOLTage:DC?, CONFigure + READ?/FETCh?, [SOURce:]VOLTage/CURRent, OUTPut[:STATe], TRIGger:COUNt, FORMat[:DATA] REAL,32|64 binary blocks, FORMat:BORDer, *ESR?/*STB?, and a 10-entry SYSTem:ERRor? queue (overflow gives -350). In --simulate mode, the safe state is OUTP OFF.
uvx labmcp ports, or ask the agent to run list_visa_resources. That tool works without --address and lists VISA resources through pyvisa-py; pass backend=@ivi to use NI-VISA or another vendor VISA library. uvx labmcp-scpi --address visa://TCPIP0::192.168.1.50::inst0::INSTR --check # LAN, VXI-11
uvx labmcp-scpi --address visa://TCPIP0::192.168.1.50::hislip0::INSTR --check # LAN, HiSLIP uvx labmcp-scpi --address tcp://192.168.1.50:5025 --check # raw socket uvx labmcp-scpi --address "visa://USB0::0x1AB1::0x0588::DS1ZA000000::INSTR" --check uvx labmcp-scpi --address "visa://GPIB0::22::INSTR?backend=@ivi" --check # NI-VISA uvx labmcp-scpi --address "serial:///dev/ttyUSB0?baudrate=9600&read_termination=CRLF" --check
`--check` prints the parsed `*IDN?` reply. If it times out, check the terminator: SCPI uses LF by default, and some serial instruments need `read_termination=CRLF`. Also check the baud rate, and that the instrument is set to SCPI rather than an emulation language.
Claude Code
claude mcp add scope -- uvx labmcp-scpi --address visa://TCPIP0::192.168.1.50::inst0::INSTR
Claude Desktop / Cursor / Windsurf (claude_desktop_config.json, .cursor/mcp.json, …)
{
"mcpServers": { "psu": { "command": "uvx", "args": [ "labmcp-scpi", "--address", "tcp://192.168.1.50:5025", "--option", "safe_state=OUTP OFF", "--option", "write_denylist=^OUTP\\d*(:STAT)? (?!OFF\\b)" ] } } }
Add --read-only to allow only queries. In read-only mode scpi_write, scpi_batch and reset_instrument disappear. device_clear and apply_safe_state stay available. Run one server per instrument, each with its own key (scope, psu, dmm, …).
| Tool | Kind | Description |
|---|---|---|
apply_safe_state | 🛑 safety | Put the instrument into the lab's configured safe state (the --option safe_state program message, e.g. 'OUTP OFF'), then read the error queue. Only listed when a safe state is configured. Call it immediately if anything looks wrong. |
device_clear | 🛑 safety | Recover a stuck or confused instrument: VISA device clear (or discard unread input on socket/serial links), report the error queue, optionally ABORt, then *CLS. This does NOT make an arbitrary instrument safe (outputs stay as they are): use apply_safe_state if the lab configured one, or the instrument's own controls. |
get_command_log | 👁 read | Return the most recent raw commands sent to / replies received from the instrument (newest last). Useful for debugging and for recording what was done. |
get_connection_info | 👁 read | Report which instrument is connected (identity, address, simulated or real), whether the server is read-only, and the active safety limits. Call this first. |
get_errors | 👁 read | Read and clear the instrument's error/event queue (SYSTem:ERRor? until 0,"No error"). Entries are returned oldest first; each can only be read once. An empty list means no errors. |
identify | 👁 read | Ask the instrument who it is (*IDN?): manufacturer, model, serial number, firmware. |
list_visa_resources | 👁 read | List GPIB / USBTMC / LAN (VXI-11, HiSLIP) instruments visible to VISA on this computer. Works without --address. Raw-socket instruments (tcp://host:5025) are not discoverable. |
query_binary_block | 👁 read | Read an IEEE 488.2 definite-length binary block (waveforms, trace data, screenshots, FORMat REAL/INTeger readings). The query must pass the same read-only checks as scpi_query. Returns length, SHA-256 and (optionally) decoded values with summary statistics, downsampled to max_points; use save_path for the full data. Blocks larger than the max_block_bytes limit are discarded. |
reconnect | 🛑 safety | Close and re-open the connection to the instrument (e.g. after it was power cycled or a cable was re-plugged). |
reset_instrument | ⚠️ hazard | Reset the instrument to its default settings (*RST, then *CLS), wait for completion and check errors. SCPI requires outputs OFF after *RST, but every other setting (levels, ranges, triggers, limits) returns to its default and some instruments differ: check the manual before resetting anything connected to a device under test. |
scpi_batch | ⚠️ hazard | Run a short sequence of SCPI commands and queries in order, checking the error queue after every step. Every step is checked against the command policy BEFORE the first one is sent, so a refused step means nothing was sent. Returns per-step replies and errors. Steps not started within ~14 minutes are not sent (status not_run). |
scpi_primer | 👁 read | Concise SCPI syntax guide (long/short forms, queries, compound commands, common commands, error queue, binary blocks) plus this server's active command policy. Works without a connection. |
scpi_query | 👁 read | Send ONE read-only SCPI query and return the instrument's text reply. |
scpi_write | ⚠️ hazard | Send any SCPI program message (settings, compound 'A;B' messages, queries with side effects) and then read the error queue. If the message contains a query, its reply is returned. This can change the instrument's state, including switching outputs on; say what the command does before calling it. Commands in the lab's denylist, or outside its allowlist, are refused before anything is sent. |
wait_operation_complete | 👁 read | Wait until the instrument has finished all pending operations (*OPC? returns 1), e.g. after starting a sweep, an acquisition or a settling source. |
get_connection_info, get_command_log and reconnect are built into every LabMCP server. apply_safe_state is listed only when a safe state is configured.
A generic server cannot know which SCPI commands are dangerous on *your* instrument. It enforces what it can and lets you add the rest:
| Rule | Where | What happens | |
|---|---|---|---|
| Single query only | scpi_query, query_binary_block (READ, allowed in read-only mode) | The header must end in ? (parameters such as VOLT? MAX are fine). Messages with ;, line breaks or control characters are refused. | |
| Built-in side-effect queries | scpi_query, query_binary_block | *TST? (self-test), *CAL?, CALibration…? and DIAGnostic…? are refused here. They must go through scpi_write. | |
--option query_denylist=REGEX | scpi_query, query_binary_block | Extra queries that your lab treats as having side effects, e.g. `^(MEAS\ | READ) on an SMU. They then need scpi_write`. |
--option write_denylist=REGEX (alias denylist) | every raw tool | No tool ever sends a matching command. Setting both names to different patterns is a configuration error. | |
--option write_allowlist=REGEX | scpi_write, scpi_batch, reset_instrument | If set, these tools may only send commands that match (queries that scpi_query accepts are always allowed). Any message containing ; is refused, even inside quotes. | |
--option safe_state=MESSAGE | apply_safe_state (SAFETY) | The program message that makes *your* instrument safe, e.g. OUTP OFF. It is sent as-is and never blocked by the lists. | |
--option error_query=QUERY | all writes | Error-queue query, default SYST:ERR?. |
Matching rules:
;-separated message unit is checked in two forms. The first is the unit as sent, upper-cased, with collapsed whitespace and no leading colon. The second reduces every mnemonic to its SCPI short form (SCPI-99 Vol. 1 §6.2.1): :OUTPut1:STATe ON becomes OUTP1:STAT ON. So ^OUTP\d*(:STAT)? (?!OFF\b) catches OUTP ON, outp:stat 1, VOLT 5;:OUTPut:STATe ON and OUTPut2 ON.OUTP 2, OUTP 1.0 and OUTP #H1 also switch an output on. Deny "everything except OFF", as above, rather than listing (ON|1).re.search. It also resolves relative headers (OUTP:POL NORM;STAT ON is checked as OUTP:STAT ON) and splits at every ;, even inside quotes. The allowlist must match a whole unit.scpi_batch is checked before the first step is sent.Examples:
# Power supply: the agent may set levels and switch the output OFF, but only a human switches it on
--option 'write_denylist=^OUTP\d*(:STAT)? (?!OFF\b)' --option 'safe_state=OUTP OFF'
--option 'write_allowlist=(CONF|SENS|TRIG|INIT|FORM|ABOR)(:\S+)*( .*)?'
--option 'query_denylist=^(MEAS|READ)' --option 'safe_state=OUTP OFF'
The environment variable LABMCP_OPTIONS splits on commas. For regular expressions that contain commas, pass t
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요