Guía MCP (Claude, Codex, Cursor)

Unha fonte primaria:Páxina do docs/mcp.md / Guía oficial do MCPA configuración oficial do cliente agora cobre moitos asistentes a través deAxuda › Conectar os asistentes AI...A través da app ouSolidCraft-cli mcp setupAliasmcp install) — incluíndo Claude Code, Claude Desktop, Codex, Cursor, OpenCode, Gemini, Copilot CLI, Windsurf, Zed e Código VS. Configuracións manuais a continuación aínda funcionan cando prefire editar a man.

O que fai o servidor MCP

SolidCraft-cli mcpOs axentes executan os mesmos comandos do motor que a barra de ferramentas, os scripts e o CLI: crear esquemas, características, parámetros de configuración, medición, captura de pantalla, exportación STEP/STL, undo/redo, sen abrir diálogos.

Comezar a

# Headless
SolidCraft-cli mcp

# Headless from a design or script
SolidCraft-cli mcp --in part.sc

# Bridged: app listens by default — bare mcp finds it (headless when none runs; --headless forces that)
SolidCraft &
SolidCraft-cli mcp

# Fixed port / second app
SolidCraft --control 7878 &
SolidCraft-cli mcp --connect 127.0.0.1:7878

En Snap instálase o CLISolidCraft.cliA aplicación escribe o porto seleccionado paracontrol/current.portno seu ficheiro de datos;--control / SolidCraft_CONTROL_PORTAínda está sobrecargado.

PrefiroSolidCraft_CONTROL_TOKENsobre--tokencando bridging - as args da liña de comandos están visibles na lista de procesos (docs oficiais).

Configuración do cliente máis rápida

O camiño máis rápido está na app:Axuda › Conectar os asistentes AI...desde unha terminal (conSolidCraft-clidispoñible — véxase as notas do PATH abaixo):

SolidCraft-cli mcp setup            # every client found on this computer
SolidCraft-cli mcp setup --dry-run  # show what it would write, change nothing
SolidCraft-cli mcp setup --client opencode --live

mcp installÉ un aliado paramcp setupO comando escribe aSolidCraftServidor de acceso a través daCamiño completodaSolidCraft-clique o executou, polo que o cliente non necesita ese binario enPATHUn cliente conta como instalado cando a súa carpeta de configuración xa existe; a configuración non inicia a aplicación do cliente.<name>.bakEn primeiro lugar, os ficheiros non legibles quedan sós, e unha reexecución posterior despois dunha actualización só refresca o camiño das entradas que escribiu (as entradas editadas polo usuario permanecen como as deixaches).--livee engadeSolidCraft-live, que ponte á aplicación aberta na porta 7878. reiniciar o cliente despois.

Desde0.22.1, nun lanzamento normal a aplicación tamén pode facelo por si mesma: engade ou refresca oSolidCraftA entrada de MCP para cada cliente instalado (Claude Desktop e Claude Code, Codex, OpenCode, Gemini CLI, Copilot CLI, Cursor, VS Code, Windsurf e Zed) e relata brevemente os que se conectaron.Configuración › Asistente › Facer que SolidCraft estea dispoñible para aplicacións de IA neste ordenador— que elimina as entradas que engadiu. Automation runs (--controlouSolidCraft_CONTROL_PORTDeixa os teus clientes sós. Axuda › Conectar os asistentes de IA... eSolidCraft-cli mcp setupManteña os camiños explícitos cando desexe configurar os seus propios clientes; a conexión automática no momento do lanzamento é complementaria a menos que o desactive.

Apoiado--clientOs valores e onde escriben:

--clientFicheiro de configuración
opencode~/.config/opencode/opencode.jsonou.jsonc)
claude-desktop%APPDATA%\Claude\claude_desktop_config.json, ~/Library/Application Support/Claude/, ~/.config/Claude/, e a carpeta de paquetes de Microsoft Store
claude-code~/.claude.json(Usuario de alcancemcpServers)
cursor~/.cursor/mcp.json
codex$CODEX_HOMEou~/.codex, config.toml(CLI, extensión IDE, Desktop)
gemini~/.gemini/settings.json
copilot~/.copilot/mcp-config.json(GitHub Copilot CLI en liña)
windsurf~/.codeium/windsurf/mcp_config.json
zedZEDsettings.json (context_servers)
vscodeCódigo de usuariomcp.json

OpenCode, Gemini, Copilot CLI, Windsurf, Zed e VS Code poden usar o mesmomcp setup --client …Formato de entrada de OpenCode manual (cando edita a man):

{
  "mcp": {
    "SolidCraft": { "type": "local", "command": ["/path/to/SolidCraft-cli", "mcp"], "enabled": true }
  }
}

Usando o AppImage, Snap ou Flatpak?SolidCraft-cliPara o MCP

A maioría dos paquetesSolidCraft-cliquePATHDespois de 0.22.1 que cobre a carpeta do instalador de Windows, a aplicación macOS (enlaza a/opt/homebrew/binou/usr/local/bin) e a AppImage (pequeno lanzador en~/.local/binen primeira execución), máis deb/rpm/FreeBSD en/usr/bine Homebrew cask. dous quedan fóraPATHDeseño: Snap ExposesSolidCraft.cliFlatPak Runsflatpak run --command=SolidCraft-cli io.tangencylabs.solidcraft- Utilice os que son do clientecommandconmcpO punto de entrada de AppImage aínda é a GUI; extraerSolidCraft-clidesde os squashfs permanece unha alternativa válida. pasos verificados e configuracións do cliente:

AppImage CLI & MCP Guía

Claude Código

De acordo co documento oficial do MCP:

claude mcp add SolidCraft -- SolidCraft-cli mcp

O proxecto.mcp.json:

{
  "mcpServers": {
    "SolidCraft": { "command": "SolidCraft-cli", "args": ["mcp"] }
  }
}

Claude Desktop (← ligazóns editar)

Coa canle de control e o MCP activados por defecto (0.21.0+, reiniciado a través de 0.30.0), inicie a aplicación normalmente e, a continuación, apunte a Claude Desktop nunmcp(atopa a aplicación en execución). Despois dunha instalación normal do paquete,SolidCraft-cliNormalmente está enPATHen calquera lugar desde 0.22.1 (Instalación de Windows; aplicación de macOS; AppImage~/.local/binlanzador despois da primeira execución; máis deb/rpm/FreeBSD e Homebrew) - reiniciar o cliente para que recolla o novoPATHSe un terminal non pode atopalo (típico de instaladores de Windows máis antigos), pase o camiño completo, por exemplo.C:\Program Files\SolidCraft\SolidCraft-cli.exePara o uso de SnapSolidCraft.cli; para o uso de Flatpakflatpakcoa argumentaciónrun --command=SolidCraft-cli io.tangencylabs.solidcraft mcpou conxuntocommand/argsPorta fixa oficial exemplo declaude_desktop_config.jsonaínda funciona cando nomeas un porto:

{
  "mcpServers": {
    "SolidCraft": {
      "command": "/path/to/SolidCraft-cli",
      "args": ["mcp"]
    }
  }
}

Para un porto fixo:args: ["mcp", "--connect", "127.0.0.1:7878"]Iniciar a aplicación conSolidCraft --control 7878.

Codex (CLI, extensión IDE, aplicación de escritorio)

O código está apoiado porSolidCraft-cli mcp setup --client codex(config baixo$CODEX_HOMEou~/.codex, config.tomlTamén podes seguirDocumentación OpenAI Codex MCP: Codex mantén os servidores MCP en~/.codex/config.toml(ou un proxecto.codex/config.tomlen proxectos de confianza), compartido polo Codex CLI, a extensión IDE e a aplicación de escritorio.

Engadir o servidor sen cabeza cun comando:

codex mcp add SolidCraft -- SolidCraft-cli mcp
codex mcp list     # check it is registered

ou edit~/.codex/config.tomlmanualmente, por exemplo, para conectarse a unha aplicación en execución e permitir unha carpeta deseños:

[mcp_servers.solidcraft]
command = "SolidCraft-cli"
args = ["mcp", "--connect", "127.0.0.1:7878", "--allow-path", "/absolute/path/to/your/designs"]

dentro do terminal UI do Codex,/mcpmostra os servidores activos. Use un camiño completo para o binario seSolidCraft-cliNon está en camiño (Snap:SolidCraft.cli· Flatpak:flatpak run --command=SolidCraft-cli io.tangencylabs.solidcraftAppImage: primeiro lanzador en execución~/.local/binou verOnde vive o CLISeparadamente, a aplicación de SolidCraftAxente chatO panel pode executar Codex a travésnpm install -g @agentclientprotocol/codex-acp(Documentos oficiais das Nacións Unidas)

Cursor

Cursor é apoiado porSolidCraft-cli mcp setup --client cursor(Escricións~/.cursor/mcp.jsonA forma de configuración manual de abaixo segueDocumentación do cursor (.cursor/mcp.jsonou~/.cursor/mcp.jsonDespois da configuración ou unha edición manual, recargar e confirmar as ferramentas aparecen nas opcións de MCP de Cursor.

{
  "mcpServers": {
    "SolidCraft": {
      "type": "stdio",
      "command": "SolidCraft-cli",
      "args": ["mcp", "--allow-path", "/absolute/path/to/your/designs"]
    }
  }
}

Use un camiño completo para o binario se o cursor non pode atoparSolidCraft-cliEn liña para Snap:SolidCraft.cliPara o Flatpak:flatpakconrun --command=SolidCraft-cli io.tangencylabs.solidcraft mcp.

Ferramentas (a partir de documentos oficiais)

ferramentapapel
list_commandsCatálogo de comandos
describe_commandDoces de parámetros para un comando; JSON Esquemas para a súa entrada e resultado onde o comando ten un contrato escrito (só de lectura)
execute / batchExecutar comandos de modelado;batchPode rolar de volta sobre erros e informesrolled_back, undone, appliedenot_runOpciónscoalesce_parameters(falso por defecto) fusionan as edicións consecutivas de parámetros comúns para que o deseño se reconstrúa unha vez por execución (un paso de desactivación; cada paso mantén uncoalescedlonxitude da liña).timings: trueengade milisegundos por paso e milisegundos totais;profile: trueengade kernel boolean / tessellate / outras divisións onde a aplicación as soporta;verbose: falsemantén as respostas de deseño grande máis pequenas. Ambas as ferramentas tamén aceptan opciónsexpect2 Afirmaciónsvolume_mm3 / bodies / bboxdespois dun éxito (relativotolpor defecto 0.002; bbox coordenadas dentro de 0.05 mm); a resposta gañaexpectation (ok, medido, esperado, desacordo); un desacordo estableceisError: truepero mantén o deseño (undoable); inválidoexpectRexeitámolo antes de que ocorra algo.expecté un argumento de ferramenta, non unha clave de paso de lote. Algunhas ferramentas poden ser nomeadas como pasos;screenshot, body_topology, batch, check_parameters, pending, runningeskill_referenceNon podo nin podocomponent.edit_in_placeoucomponent.finish_edit(Envía os únicos conexecuteUn lote tamén falla antes de que se envíe algo cando un paso certamente sería rexeitado á súa vez (#5853): un paso sen comando, un identificador de comando descoñecido (o erro nomea os identificadores máis próximos), ou - con--param-check strictUnha sesión sen cabeza verifica isto por si mesma; cando está conectada, unha aplicación que verifica ao propio nivel da solicitude verifica contra os seus propios comandos cando recibe o lote (o servidor pide unha vez por conexión a través decontrol.capabilities / param_check); unha aplicación máis vella é comprobada no servidor contra os contratos do servidor antes de enviar (enstrict, nada que viole un contrato é enviado)
inspect_design / measure / body_topologyLer xeometría e cronoloxía;inspect_designTamén se inclúen as comisións de traballo (conjoints: false)
set_parameterCrear / cambiar parámetros e recomputar
check_parametersProbe valores de parámetros sen mantelos: unedit.checkpoint, poñer cada valor nunparameters.change {changes}(un reconstruír), ler os informes elixidos, entónedit.restore_checkpointpara que o deseño, os parámetros e o historial de undo coincidan co que eran.set: {name: value}(Número ou expresión cada un, igual queset_parametere svaluec) Opciónsreport? (measure, cylinders, errors; por defecto todos os tres).Resposta inclúevalues, recomputed, measure, errors/warnings(Máisparameter_errors), cylinders(as caras cilíndricas coalescidas) erestored: trueErros en nomes de parámetros descoñecidos, malos valores ou unha restauración fallada (restored: false + restore_errorOs valores probados aínda poden estar no deseño).set_parameter→measure→body_topology→set_parameterde volta, non abatchModifica o deseño de forma indestructible e logo volve a poñelo de volta - non só de lectura, non destrutivo (xunto conset_parameter/undo/redo; new_designAínda que sexa destrutivo)
screenshotPNG do modelo ou fiestra
exportSTEP, 3MF, STL, OBJ, URDF, ...
open / save / new_designDocumentación do ciclo de vida
undo / redoHistoria
crash_reportsLista os informes de accidente deste ordenador, ou abre un por id (backtrace e comandos recentes)
skill_referenceLer un documento de habilidade bundled (SolidCraft-modeling, SolidCraft-mechanisms, SolidCraft-editing, SolidCraft-checking, SolidCraft-reportingc) Opciónsfile(Definiciónreference.mdLer só; usado polo axente chat cando as ferramentas de ficheiros están desactivadas (desde 0.21.0).initializee o sistema de chat de axente nota axentes de dirección aquí primeiro
runningMostra o que a aplicación está ocupada con ou ten a cola para cada cliente conectado (sen parámetros); responde aínda que a aplicación estea ocupada, polo que comproba despois dun período de tempo antes de reenviar un cambio (desde 0.18.3)
pendingModo de ponte: despois dunha longa solicitude de control devolve "aínda en execución", espere ata 60 s para que o resultado (done: falseaínda que corra;pending: nullcando nada está agardando). ler só, conrunning, skill_referenceecrash_reports

Ler só vs undoable: skill_reference, crash_reports, pendingerunningSon só lecturas.set_parameter, undo, redoecheck_parametersCambiar o deseño indubidablemente (check_parameterse despois volve a poñelo (non só de lectura, non de destrución).new_designsubstituír o deseño (destrutivo).

Solicitudes de longa duración (bridged):O servidor pode bloquear ata 300 s nunha chamada de control lento; axuste o tempo de tempo do cliente MCP por encima de 330 s. Se unha chamada se esgota ou volve "aínda en execución", non reenvíe o mesmo cambio - chamadapendinge / ourunningouinspect_design) Primeiro

Os axentes poden configurar o mesmo control de confirmación de ángulo de vista a través deui.prefschaveview_confirm_corner(Aínda que sexa falso)

Para as Preferencias › Navegación › rato 3Daplicación de dispositivo neste ordenadorponte, os axentes poden configurarui.prefschavesnav_bridge_enabled(default false) enav_bridge_port(default 8765). Fonte:docs / 3d-mouse.md Páxina oficialeImprimir Docs.

Os axentes poden configurar Preferencias › NavegaciónXestión de órbitasViaxeui.prefschaveright_drag_orbits(verdadeiro por defecto; falso deixa a cámara só nun arrastrar á dereita que o rato predefinido orbitaría doutro xeito).Imprimir Docs.

Os axentes poden configurar Preferencias › Navegación trackpad zoom-with-key a travésui.prefschavetrackpad_zoom_modifier (offO defecto;cmd, altouctrl- mantén esa clave só para que o zoom de rolamento vertical de dous dedos).Imprimir Docs.

Os axentes poden configurar Preferencias › Mover asemblea de deseño a travésui.prefschavesassembly_move_handles(default true; false mantén o panel de movemento anterior),joint_rotation_coarse(por defecto 10°), ejoint_rotation_fine(default 0.1°) Fonte:Imprimir Docs.

Os axentes poden configurar Preferencias › InterfaceMedida rápidaViaxeui.prefschavequick_measure(default false) Fonte:Imprimir Docs.

Os axentes poden configurar Preferencias › Esbozo e selecciónSeleccione xeometría oculta con Seleccione OutrosViaxeui.prefschaveselect_other_hidden(Default true; false restores visible-só baixo o punteiro).Imprimir Docs.

Os axentes poden xestionar as regras de folla de metal do perfil persoal a travésui.prefschavepersonal_sheet_rulese o mandosheet.manage_rulespara o administrador UI). fonte:Imprimir Docs.

Os axentes e os scripts poden xestionar os mesmos perfís de Preferencias › Xerais › Configuraciónsettings.profile.list, settings.profile.save, settings.profile.apply, settings.profile.rename, settings.profile.delete, settings.profile.exportesettings.profile.import(exportación/importación para a súa utilizaciónSolidCraft-profile/1Os comandos do motor son os comandos deexecute, non entras na táboa de ferramentas de protocolo MCP anterior.Imprimir Docs.

Os axentes poden comprobar se o deseño aberto cambiou sen levalo de novo executandodocument.revisiona travésexecuteA resposta é{document_id, revision} — revisionavanza só cando o deseño cambia, edocument_ididentifica o documento aberto (un diferente despois denew_designouopenNa canle de control de escritorio, un cliente pode chamarcontrol.subscribeunha vez en vez de votar: as primeiras respostas coincidendocument.revisionEntón, a aplicación empurradesign.changedacontecementos sempre quedocument_idourevisioncambios (coalizados a uns dez por segundo mentres os valores seguen en movemento; rexeítase unha segunda subscrición na mesma conexión - preguntardocument.revisionpara o estado actual). fonte:Páxina do docs/mcp.mdePáxina oficial.md(Seguindo o deseño do proxecto)

Condicións de deseño e xeometría do modelo:Para Coincidencia, Tangente, Igualdade, Paralelo, Perpendicular, Punto Medio (un punto e unha liña, ou os puntos intermedios de dúas liñas), Concéntrico, Colinear e Simetría, calquera dos argumentos habituais pode ser un bordo do modelo.{edge: [x,y,z], body?}ou vertex{vertex: [x,y,z], body?}Proxectos de SolidCraft que entran primeiro no esbozo; a proxección está listada encreatedA súa fonte:docs.solidcraft.io para imprimir(Construción de parámetros de comandos)

Proxecto de Proxecto (solid.extrude):As opcións de perfil por índice ou por punto normalmente son almacenadas polas curvas ao redor desa rexión para que sigan as edicións de parámetros. Cando a xeometría de referencia -por exemplo, o contorno proxectado da cara na que se sitúa o esbozo- divide un perfil deseñado en rexións, unha selección dese perfil deseñado aínda toma todo o perfil deseñado.exact_regions: truefai que cada índice ou pick de punto signifique exactamente a rexión que nomea, coincidindo co que envían os diálogos de Extrude.docs.solidcraft.io para imprimir (solid.extrudeos parámetros).

Verificación de parámetros (desde 0.17.0;SolidCraft-cli rundesde 0.27.0; chamadas de aplicacións ponteadas desde 0.27.1):Condicións xerais de contratación (describe_commandesquemas) poden ser verificados cando son chamados.--param-check off|warn|strictpara unha sesión de MCP sen cabeza (incluíndo--inEscritores) paraSolidCraft-cli run, e - desde 0.27.1 - para chamadas conectadas a unha aplicación en execución:offO que non cambia e o que non cambia,warnexecuta a chamada pero engade advertencias como unha clave probablemente errada, estrictO servidor pide á aplicación unha vez por conexión que verifique se a aplicación verifica ao propio nivel da solicitude (control.capabilitieseparam_checkenPáxina oficial.mdSe a aplicación o fai, cada chamada ebatché enviado con ese nivel e a aplicación verifica contra os seus propios comandos (de xeito que as chaves dunha aplicación máis nova non son rexeitadas polos contratos dun servidor máis vello).strict, unha resposta que non diga que a aplicación comprobada nese nivel é un erro (a chamada pode ter sido executada sen comprobar - inspeccione o deseño), e o servidor logo comproba as próximas chamadas.strictnon envía nada que rompa un; un comando sen contrato de servidor non se verifica).Con unha aplicación máis vella, manteña o servidor e a aplicación na mesma versión.joint.inspecta travésexecuteA súa fonte:Páxina do docs/mcp.md.

Cinco habilidades de axente conxunto viven baixoskills/En canto ao repo:SolidCraft-modeling, SolidCraft-editing, SolidCraft-checking, SolidCraft-mechanisms, eSolidCraft-reporting(converte un problema de usuario nun informe de erros: reproduce-lo nun deseño novo, reduci-lo a un script de comando mínimo, verifique conmeasuree unha captura de pantalla, e buscar os problemas existentes primeiro).skill_referenceferramenta (desde 0.21.0) devolve aqueles documentos embutidos sen necesidade de acceso ao disco.initializeInstrucións para que os axentes conectados chamenskill_referenceprimeiro, entón plan dimensións, construír en poucosbatchchamadas, e comprobar cada etapa conmeasureA propia nota do sistema de chat de Axente de SolidCraft dá o mesmo punteiro.pendingerunningferramentas (21 ferramentas en total con undo/redo contadas por separado;runningrestado a través de 0.30.0). Aínda en 0.30.0: opcionalexpectqueexecute/batch, check_parameters, e inicia a guía para chamarskill_referenceScripting en 0.30.0 engadeassembly.mass_properties; select.setPode tomar unha cara ou un bordo por punto ou índice do mundo-mm;document.inspectA partir de 0.24.0 o chat de axentes in-app mostra as chamadas de ferramentas como resumos simples (detalla un clic lonxe). A partir de 0.23.0 o asistente de IA in-app elixe primeiro o provedor, despois o seu modelo.

Modelos locais co asistente in-app

O Asistente de escritorio pode dirixir o deseño aberto cun modelo que se executa no seu ordenador a travésolliña, LM Estudio, ou outro servidor compatible con OpenAI. Precisa dun modelo conFerramentas nativas de chamada(En Ollama, busque unhatoolscapacidade) e VRAM suficiente para o modelo máis o seu contexto. apoio de ferramentas por si só non garante bos resultados.

Establecemento :iniciar o servidor e cargar un modelo → Preferencias › AI › Engadir axente... › API compatible con OpenAI → seleccione Ollama, LM Studio ou unha URL personalizada → introduza a URL base (por exemplo,http://localhost:11434/v1para Ollama) e o nome do modelo → Test, a continuación, engade → abra o Asistente, seleccione o punto final e defina permisos (Ask / Edits / All).

Que modelos funcionan?Os modelos locais capaces de ferramentas varían amplamente.Os resultados medicionados oficiais (teste estándar v1) viven enProblema de GitHub #4851En termos xerais, os modelos máis pequenos con capacidade de ferramentas na clase VRAM de ~ 8 GB poden funcionar; os máis grandes a miúdo obteñen puntuacións máis altas.

Resolución de problemas (nivel alto):respostas que son JSON ou código pero non cambian nada normalmente significan chamada de ferramentas débiles - proba outro modelo de #4851. Un HTTP 400 "non soporta ferramentas" significa escoller un modelo capaz de ferramentas.num_ctxAs respostas lentas adoitan significar que o modelo está a derramarse de VRAM á CPU - proba un modelo máis pequeno ou cuantización.SolidCraft-cli bench-assistantDesde 0.23.1 o Asistente tamén advirte na interface cando unha volta remata sen usar as ferramentas de SolidCraft, e cando un modelo Ollama non ten soporte para ferramentas.

Escritura oficial:Axente chat(sección de modelos locais) e#4851.

Que ficheiros pode acceder o axente

Por defecto, as ferramentas só tocan:

A carpeta de traballo na que se iniciou o servidor non conta por si mesma, polo que os ficheiros de puntos de inicio como~/.sshQueda fóra de alcance, a non ser que o permita.

SolidCraft-cli mcp --allow-path ~/designs --allow-path ~/exports

--allow-any-pathElimina o límite (comportamento anterior) - use con coidado.

Cando asave(ou calquera outra chamada) é rexeitada con "fóra das carpetas que este axente pode usar", engade a carpeta ao servidor do cliente MCPargscon--allow-pathou reenvíoSolidCraft-cli mcp setupO axente debería pedirlle que o faga en lugar de gardar a través da porta de control da aplicación, que ignora estes límites de cartafol.

En modo bridged, o servidor envíaallow_pathse aquelas carpetas abertas / gardas comodesign_foldersPara cada unha das solicitudes (verPáxina oficial.md); a aplicación tamén engade a súa carpeta de recuperación e a carpeta do deseño aberta nel baixo as mesmas regras - prefire camiños absolutos.Páxina do docs/mcp.md.

Sesións mínimas

Fluxo conceptual da sesión de exemplo oficial do doc:

  1. batchun esbozo rectángulo → extrude → filete → corte un buraco
  2. measureVolume / Área
  3. screenshotconview: "iso"
  4. exporta un camiño dentro dunha carpeta permitida

Demo de guións:exemplos/demo/enclosure_mcp.pyConstrúe unha cuberta sobre o MCP.

Vexa tamén:Servidores CAD MCP comparados · Instalacións Guía · Exemplos.