openhive-mcp-server 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +109 -8
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -53,7 +53,7 @@ async function apiRequest(path, options = {}) {
|
|
|
53
53
|
return data.data;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const server = new McpServer({ name: 'openhive', version: '1.
|
|
56
|
+
const server = new McpServer({ name: 'openhive', version: '1.5.0' });
|
|
57
57
|
|
|
58
58
|
// ── Posts ──
|
|
59
59
|
|
|
@@ -681,6 +681,87 @@ server.tool(
|
|
|
681
681
|
}
|
|
682
682
|
);
|
|
683
683
|
|
|
684
|
+
// ── Design Systems (visual inspirations library) ──
|
|
685
|
+
|
|
686
|
+
server.tool(
|
|
687
|
+
'list_design_systems',
|
|
688
|
+
'Lista a biblioteca de 58 design systems de marcas conhecidas (Stripe, Linear, Apple, Notion, etc) que podem ser usados como inspiracao visual para criar brands. Cada item retorna nome, vibe, categoria, paleta principal e mood keywords. Use isso quando o usuario pedir ajuda para criar um brand do zero ou refinar a identidade visual',
|
|
689
|
+
{
|
|
690
|
+
category: z.enum(['fintech', 'productivity', 'dev-tools', 'ai', 'luxury', 'automotive', 'social', 'media', 'other']).optional().describe('Filtrar por categoria'),
|
|
691
|
+
search: z.string().optional().describe('Buscar por nome, vibe ou mood keyword (ex: warm, dark, minimal)'),
|
|
692
|
+
limit: z.number().optional().describe('Quantidade maxima a retornar'),
|
|
693
|
+
},
|
|
694
|
+
async (input) => {
|
|
695
|
+
const params = new URLSearchParams();
|
|
696
|
+
if (input.category) params.set('category', input.category);
|
|
697
|
+
if (input.search) params.set('search', input.search);
|
|
698
|
+
if (input.limit) params.set('limit', String(input.limit));
|
|
699
|
+
const qs = params.toString();
|
|
700
|
+
const result = await apiRequest(`/api/design-systems${qs ? '?' + qs : ''}`);
|
|
701
|
+
return {
|
|
702
|
+
content: [{
|
|
703
|
+
type: 'text',
|
|
704
|
+
text: JSON.stringify({
|
|
705
|
+
total_in_library: result.totalAvailable,
|
|
706
|
+
returned: result.total,
|
|
707
|
+
design_systems: result.items.map((d) => ({
|
|
708
|
+
id: d.id,
|
|
709
|
+
name: d.name,
|
|
710
|
+
vibe: d.vibe,
|
|
711
|
+
category: d.category,
|
|
712
|
+
mood_keywords: d.moodKeywords,
|
|
713
|
+
primary_color: d.colors.primary,
|
|
714
|
+
secondary_color: d.colors.secondary,
|
|
715
|
+
})),
|
|
716
|
+
}, null, 2),
|
|
717
|
+
}],
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
);
|
|
721
|
+
|
|
722
|
+
server.tool(
|
|
723
|
+
'get_design_system',
|
|
724
|
+
'Retorna detalhes completos de um design system especifico (todas as cores, tipografia, principios). Use depois de list_design_systems quando o usuario escolher uma inspiracao',
|
|
725
|
+
{
|
|
726
|
+
design_system_id: z.string().describe('ID do design system (ex: stripe, linear, apple)'),
|
|
727
|
+
},
|
|
728
|
+
async (input) => {
|
|
729
|
+
const result = await apiRequest(`/api/design-systems/${input.design_system_id}`);
|
|
730
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
731
|
+
}
|
|
732
|
+
);
|
|
733
|
+
|
|
734
|
+
server.tool(
|
|
735
|
+
'list_design_system_categories',
|
|
736
|
+
'Retorna as categorias disponiveis na biblioteca de design systems com a quantidade em cada (fintech, dev-tools, ai, etc)',
|
|
737
|
+
{},
|
|
738
|
+
async () => {
|
|
739
|
+
const result = await apiRequest('/api/design-systems/categories');
|
|
740
|
+
return { content: [{ type: 'text', text: JSON.stringify({ categories: result }, null, 2) }] };
|
|
741
|
+
}
|
|
742
|
+
);
|
|
743
|
+
|
|
744
|
+
server.tool(
|
|
745
|
+
'suggest_brand_from_inspirations',
|
|
746
|
+
'Combina 1-5 design systems da biblioteca em uma sugestao de brand. Retorna paleta de cores, fonte, tom de voz e descricao. NAO salva nada - apenas sugere. Para salvar use create_brand depois que o usuario aprovar',
|
|
747
|
+
{
|
|
748
|
+
inspiration_ids: z.array(z.string()).min(1).max(5).describe('IDs dos design systems para combinar (ex: ["stripe", "linear"])'),
|
|
749
|
+
business_name: z.string().optional().describe('Nome do negocio do usuario'),
|
|
750
|
+
business_type: z.string().optional().describe('Tipo de negocio (ex: "AI startup", "fintech")'),
|
|
751
|
+
},
|
|
752
|
+
async (input) => {
|
|
753
|
+
const result = await apiRequest('/api/design-systems/suggest', {
|
|
754
|
+
method: 'POST',
|
|
755
|
+
body: JSON.stringify({
|
|
756
|
+
inspirationIds: input.inspiration_ids,
|
|
757
|
+
businessName: input.business_name,
|
|
758
|
+
businessType: input.business_type,
|
|
759
|
+
}),
|
|
760
|
+
});
|
|
761
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
762
|
+
}
|
|
763
|
+
);
|
|
764
|
+
|
|
684
765
|
// ── Brands ──
|
|
685
766
|
|
|
686
767
|
server.tool('list_brands', 'Lista todos os brands cadastrados (identidade visual: logo, cores, produtos, tom de voz). Use ANTES de criar qualquer post visual para perguntar ao usuario qual brand aplicar', {}, async () => {
|
|
@@ -700,17 +781,22 @@ server.tool('get_default_brand', 'Retorna o brand padrao do usuario (se houver).
|
|
|
700
781
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
701
782
|
});
|
|
702
783
|
|
|
703
|
-
server.tool('create_brand', 'Cria um novo brand com identidade visual. Aceita website_url e instagram_url para que agentes possam pesquisar
|
|
784
|
+
server.tool('create_brand', 'Cria um novo brand com identidade visual completa: 6 cores (primary, secondary, accent, background, text, muted) + 3 fontes (display, heading, body). Aceita website_url e instagram_url para que agentes possam pesquisar referencias', {
|
|
704
785
|
name: z.string().describe('Nome do brand'),
|
|
705
786
|
logo_url: z.string().optional().describe('URL do logo'),
|
|
706
|
-
primary_color: z.string().optional().describe('Cor primaria em hex (#RRGGBB)'),
|
|
707
|
-
secondary_color: z.string().optional().describe('Cor secundaria em hex
|
|
708
|
-
accent_color: z.string().optional().describe('Cor de destaque em hex'),
|
|
709
|
-
|
|
787
|
+
primary_color: z.string().optional().describe('Cor primaria em hex (#RRGGBB) - cor principal da marca'),
|
|
788
|
+
secondary_color: z.string().optional().describe('Cor secundaria em hex - cor de apoio'),
|
|
789
|
+
accent_color: z.string().optional().describe('Cor de destaque em hex - usada em CTAs e highlights'),
|
|
790
|
+
background_color: z.string().optional().describe('Cor de fundo em hex - cor base dos slides'),
|
|
791
|
+
text_color: z.string().optional().describe('Cor de texto principal em hex'),
|
|
792
|
+
muted_color: z.string().optional().describe('Cor neutra/muted em hex - bordas, textos secundarios'),
|
|
793
|
+
font_family: z.string().optional().describe('Familia de fonte display/principal (ex: Inter Variable)'),
|
|
794
|
+
heading_font: z.string().optional().describe('Fonte para titulos (ex: Sora, Geist)'),
|
|
795
|
+
body_font: z.string().optional().describe('Fonte para textos longos/body (ex: Inter)'),
|
|
710
796
|
description: z.string().optional().describe('Descricao do brand'),
|
|
711
797
|
voice_tone: z.string().optional().describe('Tom de voz: profissional, descontraido, educativo'),
|
|
712
798
|
website_url: z.string().optional().describe('URL do site oficial - agentes podem visitar para pesquisar informacoes e contexto'),
|
|
713
|
-
instagram_url: z.string().optional().describe('URL do perfil Instagram - agentes podem analisar o estilo visual e de conteudo
|
|
799
|
+
instagram_url: z.string().optional().describe('URL do perfil Instagram - agentes podem analisar o estilo visual e de conteudo'),
|
|
714
800
|
products: z.array(z.string()).optional().describe('Lista de produtos/servicos'),
|
|
715
801
|
default_hashtags: z.array(z.string()).optional().describe('Hashtags padrao a aplicar nos posts'),
|
|
716
802
|
is_default: z.boolean().optional().describe('Se este sera o brand padrao'),
|
|
@@ -721,7 +807,12 @@ server.tool('create_brand', 'Cria um novo brand com identidade visual. Aceita we
|
|
|
721
807
|
primaryColor: input.primary_color,
|
|
722
808
|
secondaryColor: input.secondary_color,
|
|
723
809
|
accentColor: input.accent_color,
|
|
810
|
+
backgroundColor: input.background_color,
|
|
811
|
+
textColor: input.text_color,
|
|
812
|
+
mutedColor: input.muted_color,
|
|
724
813
|
fontFamily: input.font_family,
|
|
814
|
+
headingFont: input.heading_font,
|
|
815
|
+
bodyFont: input.body_font,
|
|
725
816
|
description: input.description,
|
|
726
817
|
voiceTone: input.voice_tone,
|
|
727
818
|
websiteUrl: input.website_url,
|
|
@@ -736,14 +827,19 @@ server.tool('create_brand', 'Cria um novo brand com identidade visual. Aceita we
|
|
|
736
827
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
737
828
|
});
|
|
738
829
|
|
|
739
|
-
server.tool('update_brand', 'Atualiza um brand existente', {
|
|
830
|
+
server.tool('update_brand', 'Atualiza um brand existente. Todos os campos sao opcionais - so envie o que quer mudar', {
|
|
740
831
|
brand_id: z.string().describe('ID do brand'),
|
|
741
832
|
name: z.string().optional(),
|
|
742
833
|
logo_url: z.string().optional(),
|
|
743
834
|
primary_color: z.string().optional(),
|
|
744
835
|
secondary_color: z.string().optional(),
|
|
745
836
|
accent_color: z.string().optional(),
|
|
837
|
+
background_color: z.string().optional(),
|
|
838
|
+
text_color: z.string().optional(),
|
|
839
|
+
muted_color: z.string().optional(),
|
|
746
840
|
font_family: z.string().optional(),
|
|
841
|
+
heading_font: z.string().optional(),
|
|
842
|
+
body_font: z.string().optional(),
|
|
747
843
|
description: z.string().optional(),
|
|
748
844
|
voice_tone: z.string().optional(),
|
|
749
845
|
website_url: z.string().optional(),
|
|
@@ -758,7 +854,12 @@ server.tool('update_brand', 'Atualiza um brand existente', {
|
|
|
758
854
|
if (input.primary_color !== undefined) body.primaryColor = input.primary_color;
|
|
759
855
|
if (input.secondary_color !== undefined) body.secondaryColor = input.secondary_color;
|
|
760
856
|
if (input.accent_color !== undefined) body.accentColor = input.accent_color;
|
|
857
|
+
if (input.background_color !== undefined) body.backgroundColor = input.background_color;
|
|
858
|
+
if (input.text_color !== undefined) body.textColor = input.text_color;
|
|
859
|
+
if (input.muted_color !== undefined) body.mutedColor = input.muted_color;
|
|
761
860
|
if (input.font_family !== undefined) body.fontFamily = input.font_family;
|
|
861
|
+
if (input.heading_font !== undefined) body.headingFont = input.heading_font;
|
|
862
|
+
if (input.body_font !== undefined) body.bodyFont = input.body_font;
|
|
762
863
|
if (input.description !== undefined) body.description = input.description;
|
|
763
864
|
if (input.voice_tone !== undefined) body.voiceTone = input.voice_tone;
|
|
764
865
|
if (input.website_url !== undefined) body.websiteUrl = input.website_url;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openhive-mcp-server",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "OpenHive AI MCP Server - Connect Claude, Antigravity, Cursor and other IDEs to your OpenHive instance.
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "OpenHive AI MCP Server - Connect Claude, Antigravity, Cursor and other IDEs to your OpenHive instance. 39 tools including Design Systems library (58 brand inspirations), Brands (6 colors + 3 fonts), Mixed Carousel.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"openhive-mcp": "./index.js"
|