mirror of
https://github.com/aljazceru/dvmcp.git
synced 2025-12-17 21:34:24 +01:00
Use debug package for debug logging (#8)
Co-authored-by: gzuuus <gzuuus@protonmail.com>
This commit is contained in:
35
bun.lock
35
bun.lock
@@ -3,13 +3,16 @@
|
|||||||
"workspaces": {
|
"workspaces": {
|
||||||
"": {
|
"": {
|
||||||
"name": "dvmcp",
|
"name": "dvmcp",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/debug": "^4.1.12",
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"prettier": "^3.5.1",
|
"prettier": "^3.5.1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"packages/dvmcp-bridge": {
|
"packages/dvmcp-bridge": {
|
||||||
"name": "@dvmcp/bridge",
|
"name": "@dvmcp/bridge",
|
||||||
"version": "0.1.3",
|
"version": "0.1.19",
|
||||||
"bin": {
|
"bin": {
|
||||||
"dvmcp-bridge": "./cli.ts",
|
"dvmcp-bridge": "./cli.ts",
|
||||||
},
|
},
|
||||||
@@ -29,20 +32,21 @@
|
|||||||
},
|
},
|
||||||
"packages/dvmcp-commons": {
|
"packages/dvmcp-commons": {
|
||||||
"name": "@dvmcp/commons",
|
"name": "@dvmcp/commons",
|
||||||
"version": "0.1.0",
|
"version": "0.1.2",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"typescript": "^5.0.0",
|
"typescript": "^5.0.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"packages/dvmcp-discovery": {
|
"packages/dvmcp-discovery": {
|
||||||
"name": "@dvmcp/discovery",
|
"name": "@dvmcp/discovery",
|
||||||
"version": "0.1.3",
|
"version": "0.1.18",
|
||||||
"bin": {
|
"bin": {
|
||||||
"dvmcp-discovery": "./cli.ts",
|
"dvmcp-discovery": "./cli.ts",
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dvmcp/commons": "^0.1.0",
|
"@dvmcp/commons": "^0.1.2",
|
||||||
"@modelcontextprotocol/sdk": "^1.5.0",
|
"@modelcontextprotocol/sdk": "^1.5.0",
|
||||||
|
"debug": "^4.4.0",
|
||||||
"nostr-tools": "^2.10.4",
|
"nostr-tools": "^2.10.4",
|
||||||
"yaml": "^2.7.0",
|
"yaml": "^2.7.0",
|
||||||
},
|
},
|
||||||
@@ -50,6 +54,7 @@
|
|||||||
"@types/bun": "latest",
|
"@types/bun": "latest",
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
"@types/debug": "^4.1.12",
|
||||||
"typescript": "^5.0.0",
|
"typescript": "^5.0.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -77,6 +82,10 @@
|
|||||||
|
|
||||||
"@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
|
"@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
|
||||||
|
|
||||||
|
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
|
||||||
|
|
||||||
|
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
|
||||||
|
|
||||||
"@types/node": ["@types/node@22.13.5", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg=="],
|
"@types/node": ["@types/node@22.13.5", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg=="],
|
||||||
|
|
||||||
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
|
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
|
||||||
@@ -103,7 +112,7 @@
|
|||||||
|
|
||||||
"cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
|
"cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
|
||||||
|
|
||||||
"debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="],
|
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
|
||||||
|
|
||||||
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
||||||
|
|
||||||
@@ -175,7 +184,7 @@
|
|||||||
|
|
||||||
"mime-types": ["mime-types@3.0.0", "", { "dependencies": { "mime-db": "^1.53.0" } }, "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w=="],
|
"mime-types": ["mime-types@3.0.0", "", { "dependencies": { "mime-db": "^1.53.0" } }, "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w=="],
|
||||||
|
|
||||||
"ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
|
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
|
||||||
|
|
||||||
@@ -251,34 +260,40 @@
|
|||||||
|
|
||||||
"zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="],
|
"zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="],
|
||||||
|
|
||||||
|
"@dvmcp/discovery/@types/bun": ["@types/bun@1.2.6", "", { "dependencies": { "bun-types": "1.2.6" } }, "sha512-fY9CAmTdJH1Llx7rugB0FpgWK2RKuHCs3g2cFDYXUutIy1QGiPQxKkGY8owhfZ4MXWNfxwIbQLChgH5gDsY7vw=="],
|
||||||
|
|
||||||
"@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
|
"@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
|
||||||
|
|
||||||
"@scure/bip32/@noble/curves": ["@noble/curves@1.1.0", "", { "dependencies": { "@noble/hashes": "1.3.1" } }, "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA=="],
|
"@scure/bip32/@noble/curves": ["@noble/curves@1.1.0", "", { "dependencies": { "@noble/hashes": "1.3.1" } }, "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA=="],
|
||||||
|
|
||||||
"@scure/bip32/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
|
"@scure/bip32/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
|
||||||
|
|
||||||
"body-parser/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
|
|
||||||
|
|
||||||
"body-parser/iconv-lite": ["iconv-lite@0.5.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag=="],
|
"body-parser/iconv-lite": ["iconv-lite@0.5.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag=="],
|
||||||
|
|
||||||
"body-parser/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="],
|
"body-parser/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="],
|
||||||
|
|
||||||
|
"express/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="],
|
||||||
|
|
||||||
"finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
"finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||||
|
|
||||||
"finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
|
"finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
|
||||||
|
|
||||||
|
"send/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="],
|
||||||
|
|
||||||
"send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
|
"send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
|
||||||
|
|
||||||
"send/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
"send/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
||||||
|
|
||||||
"send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
"@dvmcp/discovery/@types/bun/bun-types": ["bun-types@1.2.6", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-FbCKyr5KDiPULUzN/nm5oqQs9nXCHD8dVc64BArxJadCvbNzAI6lUWGh9fSJZWeDIRD38ikceBU8Kj/Uh+53oQ=="],
|
||||||
|
|
||||||
"@scure/bip32/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="],
|
"@scure/bip32/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="],
|
||||||
|
|
||||||
"body-parser/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
"express/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||||
|
|
||||||
"finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
"finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
||||||
|
|
||||||
|
"send/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||||
|
|
||||||
"send/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
"send/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,5 +13,8 @@
|
|||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"prettier": "^3.5.1"
|
"prettier": "^3.5.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@types/debug": "^4.1.12"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,6 +69,14 @@ bun run start --server naddr1...
|
|||||||
|
|
||||||
This is useful when you want to work with a specific subset of tools rather than discovering all tools from a provider.
|
This is useful when you want to work with a specific subset of tools rather than discovering all tools from a provider.
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
|
||||||
|
You can enable debug mode by setting the `DEBUG` environment variable to `*`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
DEBUG=* npx @dvmcp/discovery
|
||||||
|
```
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
Run the test suite:
|
Run the test suite:
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ import {
|
|||||||
fetchProviderAnnouncement,
|
fetchProviderAnnouncement,
|
||||||
fetchServerAnnouncement,
|
fetchServerAnnouncement,
|
||||||
parseAnnouncement,
|
parseAnnouncement,
|
||||||
type DVMAnnouncement,
|
|
||||||
} from './src/direct-discovery.js';
|
} from './src/direct-discovery.js';
|
||||||
import type { DirectServerInfo } from './index.js';
|
import type { DirectServerInfo } from './index.js';
|
||||||
|
import logger from './src/logger';
|
||||||
|
|
||||||
const defaultConfigPath = join(process.cwd(), 'config.dvmcp.yml');
|
const defaultConfigPath = join(process.cwd(), 'config.dvmcp.yml');
|
||||||
let configPath = defaultConfigPath;
|
let configPath = defaultConfigPath;
|
||||||
@@ -47,7 +47,7 @@ if (
|
|||||||
argv[configPathArgIndex + 1]
|
argv[configPathArgIndex + 1]
|
||||||
) {
|
) {
|
||||||
configPath = resolve(argv[configPathArgIndex + 1]);
|
configPath = resolve(argv[configPathArgIndex + 1]);
|
||||||
console.log(`Using config path: ${configPath}`);
|
logger(`Using config path: ${configPath}`);
|
||||||
setConfigPath(configPath);
|
setConfigPath(configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ const configFields: Record<string, FieldConfig> = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const configure = async () => {
|
const configure = async () => {
|
||||||
console.log(
|
logger(
|
||||||
`${CONFIG_EMOJIS.SETUP} DVMCP Discovery Configuration Setup ${CONFIG_EMOJIS.SETUP}`
|
`${CONFIG_EMOJIS.SETUP} DVMCP Discovery Configuration Setup ${CONFIG_EMOJIS.SETUP}`
|
||||||
);
|
);
|
||||||
const generator = new ConfigGenerator<Config>(configPath, configFields);
|
const generator = new ConfigGenerator<Config>(configPath, configFields);
|
||||||
@@ -119,7 +119,7 @@ const configure = async () => {
|
|||||||
|
|
||||||
const runApp = async (directServerInfo?: DirectServerInfo) => {
|
const runApp = async (directServerInfo?: DirectServerInfo) => {
|
||||||
const main = await import('./index.js');
|
const main = await import('./index.js');
|
||||||
console.log(`${CONFIG_EMOJIS.INFO} Running main application...`);
|
logger(`${CONFIG_EMOJIS.INFO} Running main application...`);
|
||||||
await main.default(directServerInfo);
|
await main.default(directServerInfo);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -134,9 +134,7 @@ const setupInMemoryConfig = (relays: string[], pubkey: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const setupFromProvider = async (nprofileEntity: string) => {
|
const setupFromProvider = async (nprofileEntity: string) => {
|
||||||
console.log(
|
logger(`${CONFIG_EMOJIS.INFO} Setting up from provider: ${nprofileEntity}`);
|
||||||
`${CONFIG_EMOJIS.INFO} Setting up from provider: ${nprofileEntity}`
|
|
||||||
);
|
|
||||||
|
|
||||||
const providerData = decodeNprofile(nprofileEntity);
|
const providerData = decodeNprofile(nprofileEntity);
|
||||||
if (!providerData) {
|
if (!providerData) {
|
||||||
@@ -152,7 +150,7 @@ const setupFromProvider = async (nprofileEntity: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setupInMemoryConfig(providerData.relays, providerData.pubkey);
|
setupInMemoryConfig(providerData.relays, providerData.pubkey);
|
||||||
console.log(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from provider`);
|
logger(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from provider`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error: ${error}`);
|
console.error(`Error: ${error}`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@@ -160,7 +158,7 @@ const setupFromProvider = async (nprofileEntity: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const setupFromServer = async (naddrEntity: string) => {
|
const setupFromServer = async (naddrEntity: string) => {
|
||||||
console.log(`${CONFIG_EMOJIS.INFO} Setting up from server: ${naddrEntity}`);
|
logger(`${CONFIG_EMOJIS.INFO} Setting up from server: ${naddrEntity}`);
|
||||||
|
|
||||||
const addrData = decodeNaddr(naddrEntity);
|
const addrData = decodeNaddr(naddrEntity);
|
||||||
if (!addrData) {
|
if (!addrData) {
|
||||||
@@ -182,7 +180,7 @@ const setupFromServer = async (naddrEntity: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setupInMemoryConfig(addrData.relays, addrData.pubkey);
|
setupInMemoryConfig(addrData.relays, addrData.pubkey);
|
||||||
console.log(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from server`);
|
logger(`${CONFIG_EMOJIS.SUCCESS} Successfully set up from server`);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
pubkey: addrData.pubkey,
|
pubkey: addrData.pubkey,
|
||||||
@@ -213,7 +211,7 @@ const cliMain = async () => {
|
|||||||
}
|
}
|
||||||
// Handle normal config file mode
|
// Handle normal config file mode
|
||||||
else if (!existsSync(configPath)) {
|
else if (!existsSync(configPath)) {
|
||||||
console.log(
|
logger(
|
||||||
`${CONFIG_EMOJIS.INFO} No configuration file found. Starting setup...`
|
`${CONFIG_EMOJIS.INFO} No configuration file found. Starting setup...`
|
||||||
);
|
);
|
||||||
await configure();
|
await configure();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { getConfig } from './src/config';
|
import { getConfig } from './src/config';
|
||||||
import { DiscoveryServer } from './src/discovery-server';
|
import { DiscoveryServer } from './src/discovery-server';
|
||||||
import type { DVMAnnouncement } from './src/direct-discovery';
|
import type { DVMAnnouncement } from './src/direct-discovery';
|
||||||
|
import logger from './src/logger';
|
||||||
|
|
||||||
export interface DirectServerInfo {
|
export interface DirectServerInfo {
|
||||||
pubkey: string;
|
pubkey: string;
|
||||||
@@ -14,9 +15,7 @@ async function main(directServerInfo?: DirectServerInfo | null) {
|
|||||||
|
|
||||||
if (directServerInfo) {
|
if (directServerInfo) {
|
||||||
// If we have direct server info, register tools from that server only
|
// If we have direct server info, register tools from that server only
|
||||||
console.log(
|
logger(`Using direct server with pubkey: ${directServerInfo.pubkey}`);
|
||||||
`Using direct server with pubkey: ${directServerInfo.pubkey}`
|
|
||||||
);
|
|
||||||
await server.registerDirectServerTools(
|
await server.registerDirectServerTools(
|
||||||
directServerInfo.pubkey,
|
directServerInfo.pubkey,
|
||||||
directServerInfo.announcement
|
directServerInfo.announcement
|
||||||
@@ -26,8 +25,8 @@ async function main(directServerInfo?: DirectServerInfo | null) {
|
|||||||
await server.start();
|
await server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`DVMCP Discovery Server (${config.mcp.version}) started`);
|
logger(`DVMCP Discovery Server (${config.mcp.version}) started`);
|
||||||
console.log(`Connected to ${config.nostr.relayUrls.length} relays`);
|
logger(`Connected to ${config.nostr.relayUrls.length} relays`);
|
||||||
|
|
||||||
// Handle shutdown
|
// Handle shutdown
|
||||||
const cleanup = () => {
|
const cleanup = () => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@dvmcp/discovery",
|
"name": "@dvmcp/discovery",
|
||||||
"version": "0.1.17",
|
"version": "0.1.18",
|
||||||
"description": "Discovery service for MCP tools in the Nostr DVM ecosystem",
|
"description": "Discovery service for MCP tools in the Nostr DVM ecosystem",
|
||||||
"module": "index.ts",
|
"module": "index.ts",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -27,13 +27,15 @@
|
|||||||
"@types/bun": "latest"
|
"@types/bun": "latest"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"typescript": "^5.0.0"
|
"typescript": "^5.0.0",
|
||||||
|
"@types/debug": "^4.1.12"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@modelcontextprotocol/sdk": "^1.5.0",
|
"@modelcontextprotocol/sdk": "^1.5.0",
|
||||||
"nostr-tools": "^2.10.4",
|
"nostr-tools": "^2.10.4",
|
||||||
"yaml": "^2.7.0",
|
"yaml": "^2.7.0",
|
||||||
"@dvmcp/commons": "^0.1.2"
|
"@dvmcp/commons": "^0.1.2",
|
||||||
|
"debug": "^4.4.0"
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import type { Event, Filter } from 'nostr-tools';
|
|||||||
import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler';
|
import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler';
|
||||||
import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants';
|
import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants';
|
||||||
import type { NaddrData, NprofileData } from './nip19-utils';
|
import type { NaddrData, NprofileData } from './nip19-utils';
|
||||||
|
import logger from './logger';
|
||||||
|
|
||||||
export interface DVMAnnouncement {
|
export interface DVMAnnouncement {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -19,7 +20,7 @@ async function fetchAnnouncement(
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Query for the announcement event
|
// Query for the announcement event
|
||||||
console.log('Querying for announcement event:', filter);
|
logger('Querying for announcement event:', filter);
|
||||||
const events = await relayHandler.queryEvents(filter);
|
const events = await relayHandler.queryEvents(filter);
|
||||||
|
|
||||||
if (events.length === 0) {
|
if (events.length === 0) {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|||||||
import { ToolRegistry } from './tool-registry';
|
import { ToolRegistry } from './tool-registry';
|
||||||
import { ToolExecutor } from './tool-executor';
|
import { ToolExecutor } from './tool-executor';
|
||||||
import type { DVMAnnouncement } from './direct-discovery';
|
import type { DVMAnnouncement } from './direct-discovery';
|
||||||
|
import logger from './logger';
|
||||||
|
|
||||||
export class DiscoveryServer {
|
export class DiscoveryServer {
|
||||||
private mcpServer: McpServer;
|
private mcpServer: McpServer;
|
||||||
@@ -63,7 +64,7 @@ export class DiscoveryServer {
|
|||||||
private async handleDVMAnnouncement(event: Event) {
|
private async handleDVMAnnouncement(event: Event) {
|
||||||
try {
|
try {
|
||||||
if (!this.isAllowedDVM(event.pubkey)) {
|
if (!this.isAllowedDVM(event.pubkey)) {
|
||||||
console.log('DVM not in whitelist:', event.pubkey);
|
logger('DVM not in whitelist:', event.pubkey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +104,7 @@ export class DiscoveryServer {
|
|||||||
pubkey: string,
|
pubkey: string,
|
||||||
announcement: DVMAnnouncement
|
announcement: DVMAnnouncement
|
||||||
) {
|
) {
|
||||||
console.log('Starting discovery server with direct server tools...');
|
logger('Starting discovery server with direct server tools...');
|
||||||
|
|
||||||
if (!announcement?.tools) {
|
if (!announcement?.tools) {
|
||||||
console.error('No tools found in server announcement');
|
console.error('No tools found in server announcement');
|
||||||
@@ -112,27 +113,25 @@ export class DiscoveryServer {
|
|||||||
|
|
||||||
this.registerToolsFromAnnouncement(pubkey, announcement.tools);
|
this.registerToolsFromAnnouncement(pubkey, announcement.tools);
|
||||||
|
|
||||||
console.log(
|
logger(`Registered ${announcement.tools.length} tools from direct server`);
|
||||||
`Registered ${announcement.tools.length} tools from direct server`
|
|
||||||
);
|
|
||||||
|
|
||||||
// Connect the MCP server
|
// Connect the MCP server
|
||||||
const transport = new StdioServerTransport();
|
const transport = new StdioServerTransport();
|
||||||
await this.mcpServer.connect(transport);
|
await this.mcpServer.connect(transport);
|
||||||
|
|
||||||
console.log('DVMCP Discovery Server started');
|
logger('DVMCP Discovery Server started');
|
||||||
}
|
}
|
||||||
|
|
||||||
public async start() {
|
public async start() {
|
||||||
console.log('Starting discovery server...');
|
logger('Starting discovery server...');
|
||||||
|
|
||||||
await this.startDiscovery();
|
await this.startDiscovery();
|
||||||
console.log(`Discovered ${this.toolRegistry.listTools().length} tools`);
|
logger(`Discovered ${this.toolRegistry.listTools().length} tools`);
|
||||||
|
|
||||||
const transport = new StdioServerTransport();
|
const transport = new StdioServerTransport();
|
||||||
await this.mcpServer.connect(transport);
|
await this.mcpServer.connect(transport);
|
||||||
|
|
||||||
console.log('DVMCP Discovery Server started');
|
logger('DVMCP Discovery Server started');
|
||||||
}
|
}
|
||||||
|
|
||||||
public async cleanup(): Promise<void> {
|
public async cleanup(): Promise<void> {
|
||||||
|
|||||||
5
packages/dvmcp-discovery/src/logger.ts
Normal file
5
packages/dvmcp-discovery/src/logger.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import debug from 'debug';
|
||||||
|
|
||||||
|
const logger = debug('dvmcp-discovery');
|
||||||
|
|
||||||
|
export default logger;
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { nip19 } from 'nostr-tools';
|
import { nip19 } from 'nostr-tools';
|
||||||
import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants';
|
import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants';
|
||||||
|
import logger from './logger';
|
||||||
|
|
||||||
// Default fallback relay when no relay hints are provided
|
// Default fallback relay when no relay hints are provided
|
||||||
export const DEFAULT_FALLBACK_RELAY = 'wss://relay.dvmcp.fun';
|
export const DEFAULT_FALLBACK_RELAY = 'wss://relay.dvmcp.fun';
|
||||||
@@ -32,7 +33,7 @@ export function decodeNprofile(nprofileEntity: string): NprofileData | null {
|
|||||||
// Ensure we have at least one relay by using the fallback if necessary
|
// Ensure we have at least one relay by using the fallback if necessary
|
||||||
const profileData = data as NprofileData;
|
const profileData = data as NprofileData;
|
||||||
if (!profileData.relays || profileData.relays.length === 0) {
|
if (!profileData.relays || profileData.relays.length === 0) {
|
||||||
console.log(
|
logger(
|
||||||
`No relay hints in nprofile, using fallback relay: ${DEFAULT_FALLBACK_RELAY}`
|
`No relay hints in nprofile, using fallback relay: ${DEFAULT_FALLBACK_RELAY}`
|
||||||
);
|
);
|
||||||
profileData.relays = [DEFAULT_FALLBACK_RELAY];
|
profileData.relays = [DEFAULT_FALLBACK_RELAY];
|
||||||
@@ -67,7 +68,7 @@ export function decodeNaddr(naddrEntity: string): NaddrData | null {
|
|||||||
// Ensure we have at least one relay by using the fallback if necessary
|
// Ensure we have at least one relay by using the fallback if necessary
|
||||||
const addrData = data as NaddrData;
|
const addrData = data as NaddrData;
|
||||||
if (!addrData.relays || addrData.relays.length === 0) {
|
if (!addrData.relays || addrData.relays.length === 0) {
|
||||||
console.log(
|
logger(
|
||||||
`No relay hints in naddr, using fallback relay: ${DEFAULT_FALLBACK_RELAY}`
|
`No relay hints in naddr, using fallback relay: ${DEFAULT_FALLBACK_RELAY}`
|
||||||
);
|
);
|
||||||
addrData.relays = [DEFAULT_FALLBACK_RELAY];
|
addrData.relays = [DEFAULT_FALLBACK_RELAY];
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
TOOL_RESPONSE_KIND,
|
TOOL_RESPONSE_KIND,
|
||||||
DVM_NOTICE_KIND,
|
DVM_NOTICE_KIND,
|
||||||
} from '@dvmcp/commons/constants';
|
} from '@dvmcp/commons/constants';
|
||||||
|
import logger from './logger';
|
||||||
|
|
||||||
interface ExecutionContext {
|
interface ExecutionContext {
|
||||||
timeoutId: ReturnType<typeof setTimeout>;
|
timeoutId: ReturnType<typeof setTimeout>;
|
||||||
@@ -65,7 +66,7 @@ export class ToolExecutor {
|
|||||||
|
|
||||||
private createExecutionContext(executionId: string): ExecutionContext {
|
private createExecutionContext(executionId: string): ExecutionContext {
|
||||||
const timeoutId = setTimeout(() => {
|
const timeoutId = setTimeout(() => {
|
||||||
console.log('Execution timeout for:', executionId);
|
logger('Execution timeout for:', executionId);
|
||||||
this.cleanupExecution(executionId);
|
this.cleanupExecution(executionId);
|
||||||
}, ToolExecutor.EXECUTION_TIMEOUT);
|
}, ToolExecutor.EXECUTION_TIMEOUT);
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { type Tool } from '@modelcontextprotocol/sdk/types.js';
|
|||||||
import { ToolSchema } from '@modelcontextprotocol/sdk/types.js';
|
import { ToolSchema } from '@modelcontextprotocol/sdk/types.js';
|
||||||
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
import logger from './logger';
|
||||||
|
|
||||||
export class ToolRegistry {
|
export class ToolRegistry {
|
||||||
private discoveredTools: Map<string, { tool: Tool; providerPubkey: string }> =
|
private discoveredTools: Map<string, { tool: Tool; providerPubkey: string }> =
|
||||||
@@ -72,7 +73,7 @@ export class ToolRegistry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
console.log('Tool registered successfully:', toolId);
|
logger('Tool registered successfully:', toolId);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error registering tool:', toolId, error);
|
console.error('Error registering tool:', toolId, error);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user