From odoo-content-toolkit
Write SEO-optimized blog articles and publish to Odoo 18 via XML-RPC API. Supports research, AI images, and full SEO metadata.
How this skill is triggered — by the user, by Claude, or both
Slash command
/odoo-content-toolkit:blog-writerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Tento skill vytváří SEO-optimalizované blog články a publikuje je do Odoo 18 přes XML-RPC API (`blog.post`). Články jsou vždy vytvořeny jako DRAFT — admin publikuje ručně.
Tento skill vytváří SEO-optimalizované blog články a publikuje je do Odoo 18 přes XML-RPC API (blog.post). Články jsou vždy vytvořeny jako DRAFT — admin publikuje ručně.
Environment variables: ODOO_URL, ODOO_DB, ODOO_API_KEY (UID se zjistí automaticky)
Přečti VŽDY tyto reference před psaním:
@${CLAUDE_PLUGIN_ROOT}/references/xmlrpc-api.md — API pro blog.blog, blog.post, blog.tag@${CLAUDE_PLUGIN_ROOT}/references/seo-guidelines.md — SEO pravidla a struktura článkůZjisti od uživatele:
Pokud téma vyžaduje aktuální informace:
WebSearch pro průzkum tématuPřed psaním připrav:
Hlavní klíčové slovo: [keyword]
Sekundární klíčová slova: [kw1, kw2, kw3]
Long-tail keywords: [long-tail-1, long-tail-2]
Titulek (name): max 60 znaků, obsahuje hlavní keyword
Meta title: {keyword} — {doplnění} | {Brand}
Meta description: max 155 znaků, keyword + benefit + CTA
Meta keywords: čárkami oddělená (5-10)
SEO slug: lowercase-bez-diakritiky
Teaser: 1-3 věty, hook pro čtenáře
Piš v HTML formátu pro Odoo blog.post.content:
<section class="s_text_block">
<div class="container">
<div class="row">
<div class="col-lg-12">
<h2>Úvodní sekce</h2>
<p>Úvodní odstavec — hook, kontext, proč by měl čtenář pokračovat.
Klíčové slovo v prvních 100 slovech.</p>
<h2>Hlavní sekce 1</h2>
<p>Obsah...</p>
<h3>Podsekce</h3>
<p>Detaily...</p>
<h2>Hlavní sekce 2</h2>
<ul>
<li><strong>Bod 1:</strong> Popis...</li>
<li><strong>Bod 2:</strong> Popis...</li>
</ul>
<!-- Pokud máme AI obrázek -->
<figure>
<img src="{image_url}" alt="Popisný alt text s klíčovým slovem" class="img-fluid"/>
<figcaption>Popis obrázku</figcaption>
</figure>
<h2>Závěr</h2>
<p>Shrnutí hlavních bodů a CTA.</p>
</div>
</div>
</div>
</section>
Pravidla HTML:
Pokud uživatel chce cover obrázek:
image_1920 field nebo cover_propertiesNapíš Python skript a spusť přes osascript (VM Bash nefunguje kvůli ENOSPC):
import xmlrpc.client, os, json
# --- Connection ---
ODOO_URL = os.environ.get('ODOO_URL', 'https://www.michalvarys.eu') # VZDY s www!
ODOO_DB = os.environ.get('ODOO_DB', 'varyshop')
ODOO_API_KEY = os.environ.get('ODOO_API_KEY', '')
ODOO_LOGIN = os.environ.get('ODOO_LOGIN', '[email protected]')
common = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/common')
models = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/object', allow_none=True)
# KRITICKE: authenticate VYZADUJE login (email), NE prazdny string!
UID = common.authenticate(ODOO_DB, ODOO_LOGIN, ODOO_API_KEY, {})
if not UID:
raise Exception("Authentication failed — check ODOO_LOGIN, ODOO_API_KEY and ODOO_DB")
# --- Najdi nebo vytvoř blog ---
blogs = models.execute_kw(ODOO_DB, UID, ODOO_API_KEY, 'blog.blog', 'search_read', [
[['active', '=', True]]
], {'fields': ['id', 'name'], 'limit': 5})
if blogs:
blog_id = blogs[0]['id'] # Použij první blog
print(f"Použiji blog: {blogs[0]['name']} (ID: {blog_id})")
else:
blog_id = models.execute_kw(ODOO_DB, UID, ODOO_API_KEY, 'blog.blog', 'create', [{
'name': 'Blog',
}])
print(f"Vytvořen nový blog (ID: {blog_id})")
# --- Vytvoř nebo najdi tagy ---
def get_or_create_tag(name):
ids = models.execute_kw(ODOO_DB, UID, ODOO_API_KEY, 'blog.tag', 'search', [
[['name', '=ilike', name]]
])
if ids:
return ids[0]
return models.execute_kw(ODOO_DB, UID, ODOO_API_KEY, 'blog.tag', 'create', [{'name': name}])
tag_ids = [get_or_create_tag(t) for t in TAG_NAMES]
# --- Vytvoř článek ---
post_id = models.execute_kw(ODOO_DB, UID, ODOO_API_KEY, 'blog.post', 'create', [{
'name': TITLE,
'subtitle': SUBTITLE,
'blog_id': blog_id,
'content': HTML_CONTENT,
'tag_ids': [(6, 0, tag_ids)],
'teaser_manual': TEASER,
'website_meta_title': META_TITLE,
'website_meta_description': META_DESCRIPTION,
'website_meta_keywords': META_KEYWORDS,
'seo_name': SEO_SLUG,
'is_published': False, # VŽDY DRAFT!
}])
print(f"\n=== Blog článek vytvořen ===")
print(f"ID: {post_id}")
print(f"Titulek: {TITLE}")
print(f"Admin: {ODOO_URL}/web#id={post_id}&model=blog.post&view_type=form")
Vrať uživateli:
is_published: FalseKvůli ENOSPC na VM použij mcp__Control_your_Mac__osascript pro spuštění Python skriptu:
do shell script "cd /Users/michalvarys/projekty/startbusiness && export $(grep -v '^#' .env | xargs) && python3 script_name.py"
Nebo zapiš skript do souboru a spusť:
/Users/michalvarys/projekty/startbusiness/.envnpx claudepluginhub michalvarys/claude-plugins --plugin odoo-content-toolkitCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.