defineToolPlugin을 사용하세요.
권장 흐름은 다음과 같습니다.
openclaw plugins init으로 패키지를 스캐폴드합니다.defineToolPlugin으로 도구를 작성합니다.- JavaScript를 빌드합니다.
openclaw plugins build로openclaw.plugin.json및package.json메타데이터를 생성합니다.- 게시하거나 설치하기 전에 생성된 메타데이터를 검증합니다.
요구 사항
- Node >= 22.
- TypeScript ESM 패키지 출력.
- 구성 및 도구 매개변수 스키마용
typebox. openclaw/plugin-sdk/tool-plugin을 내보내는 첫 OpenClaw 버전인openclaw >=2026.5.17.dist/,openclaw.plugin.json,package.json을 배포할 수 있는 패키지 루트.
typebox를 가져오므로 typebox를 devDependencies뿐만 아니라 dependencies에 유지하세요.
빠른 시작
새 플러그인 패키지를 만듭니다.src/index.ts:echo도구가 있는defineToolPlugin엔트리.src/index.test.ts: 작은 메타데이터 테스트.tsconfig.json:dist/로 출력되는 NodeNext TypeScript.package.json: 스크립트, 런타임 의존성,openclaw.extensions: ["./dist/index.js"].openclaw.plugin.json: 초기 도구를 위한 생성된 매니페스트 메타데이터.
도구 작성
defineToolPlugin은 플러그인 ID, 선택적 구성 스키마, 정적 도구 목록을 받습니다. 매개변수 및 구성 타입은 TypeBox 스키마에서 추론됩니다.
선택적 도구와 팩터리 도구
모델로 보내기 전에 사용자가 도구를 명시적으로 허용 목록에 추가해야 하는 경우optional: true를 설정하세요.
openclaw plugins build는 일치하는 toolMetadata.<tool>.optional 매니페스트 엔트리를 작성하므로, OpenClaw는 플러그인 런타임 코드를 로드하지 않고도 도구를 검색할 수 있습니다.
도구를 만들기 전에 런타임 도구 컨텍스트가 필요한 경우 factory를 사용하세요. 팩터리는 메타데이터를 정적으로 유지하면서 도구가 특정 실행에서 제외되거나, 샌드박스 상태를 검사하거나, 런타임 헬퍼를 바인딩할 수 있게 합니다.
definePluginEntry를 직접 사용하세요.
반환 값
defineToolPlugin은 일반 반환 값을 OpenClaw 도구 결과 형식으로 감쌉니다.
- 모델이 정확히 해당 텍스트를 보아야 하는 경우 문자열을 반환합니다.
- 모델이 형식화된 JSON을 보고, OpenClaw가 원래 값을
details에 유지하기를 원하는 경우 JSON 호환 값을 반환합니다.
AgentToolResult를 반환하거나 기존 api.registerTool 구현을 재사용해야 하는 경우 팩터리 도구를 사용하세요. 완전히 동적인 도구 또는 혼합 플러그인 기능이 필요한 경우 defineToolPlugin 대신 definePluginEntry를 사용하세요.
구성
configSchema는 선택 사항입니다. 생략하면 OpenClaw는 엄격한 빈 객체 스키마를 사용하며, 생성된 매니페스트에는 여전히 configSchema가 포함됩니다.
configSchema를 포함하면 두 번째 execute 인수는 스키마에서 타입이 지정됩니다.
생성된 메타데이터
OpenClaw는 콜드 메타데이터에서 설치된 플러그인을 검색합니다. 플러그인 런타임 코드를 가져오기 전에 플러그인 매니페스트를 읽을 수 있어야 합니다. 따라서defineToolPlugin은 정적 메타데이터를 노출하고, openclaw plugins build는 해당 메타데이터를 패키지에 기록합니다.
플러그인 ID, 이름, 설명, 구성 스키마, 활성화 또는 도구 이름을 변경한 후에는 생성기를 실행하세요.
contracts.tools는 중요한 검색 계약입니다. 이는 설치된 모든 플러그인 런타임을 로드하지 않고도 어떤 플러그인이 각 도구를 소유하는지 OpenClaw에 알려줍니다. 매니페스트가 오래되면 도구가 검색에서 누락되거나 등록 오류의 원인으로 잘못된 플러그인이 지목될 수 있습니다.
패키지 메타데이터
단순한 도구 플러그인 워크플로에서는openclaw plugins build가 package.json을 선택한 단일 런타임 엔트리에 맞춥니다.
./dist/index.js 같은 빌드된 JavaScript를 사용하세요. 소스 엔트리는 워크스페이스 개발에는 유용하지만, 게시된 패키지는 TypeScript 런타임 로딩에 의존해서는 안 됩니다.
CI에서 검증
생성된 메타데이터가 오래되었을 때 파일을 다시 쓰지 않고 CI를 실패시키려면plugins build --check를 사용하세요.
plugins validate는 다음을 확인합니다.
openclaw.plugin.json이 존재하고 일반 매니페스트 로더를 통과합니다.- 현재 엔트리가
defineToolPlugin메타데이터를 내보냅니다. - 생성된 매니페스트 필드가 엔트리 메타데이터와 일치합니다.
contracts.tools가 선언된 도구 이름과 일치합니다.package.json이openclaw.extensions를 선택한 런타임 엔트리로 가리킵니다.
로컬에서 설치 및 검사
별도의 OpenClaw 체크아웃 또는 설치된 CLI에서 패키지 경로를 설치합니다.게시
패키지가 준비되면 ClawHub를 통해 게시합니다.문제 해결
plugin entry not found: ./dist/index.js
선택한 엔트리 파일이 존재하지 않습니다. npm run build를 실행한 다음 openclaw plugins build --entry ./dist/index.js 또는 openclaw plugins validate --entry ./dist/index.js를 다시 실행하세요.
plugin entry does not expose defineToolPlugin metadata
엔트리가 defineToolPlugin으로 생성된 값을 내보내지 않았습니다. 모듈의 기본 내보내기가 defineToolPlugin(...) 결과인지 확인하거나, --entry로 올바른 엔트리를 전달하세요.
openclaw.plugin.json generated metadata is stale
매니페스트가 더 이상 엔트리 메타데이터와 일치하지 않습니다. 다음을 실행하세요.
openclaw.plugin.json 및 package.json 변경 사항을 모두 커밋하세요.
package.json openclaw.extensions must include ./dist/index.js
패키지 메타데이터가 다른 런타임 엔트리를 가리킵니다. 생성기가 패키지 메타데이터를 배포하려는 엔트리에 맞추도록 openclaw plugins build --entry ./dist/index.js를 실행하세요.
Cannot find package 'typebox'
빌드된 플러그인은 런타임에 typebox를 가져옵니다. typebox를 dependencies에 유지하고, 패키지 의존성을 다시 설치하고, 다시 빌드한 뒤 검증을 다시 실행하세요.
설치 후 도구가 나타나지 않음
다음을 순서대로 확인하세요.openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.json에 예상 도구 이름이 포함된contracts.tools가 있습니다.package.json에openclaw.extensions: ["./dist/index.js"]가 있습니다.- 플러그인을 설치한 후 Gateway가 재시작되었거나 다시 로드되었습니다.